WÄ…tki
 
[ Pobierz całość w formacie PDF ]

WebSite site4 = new WebSite();
site3.Description = "Informacje o C#";
site4.Description = site3.Description;
bool isSiteEqual = site3.Equals(site4);
isSiteEqual = object.Equals(site3, site4);
W powyższym przykładzie właściwość site4.Description została ustawiona na wartość wła-
ściwości site3.Description, dzięki czemu oba obiekty uzyskały taką samą wartość. Nie ma to
jednakże znaczenia, ponieważ oba wywołania metody Equals zwracają false. Dzieje się tak, gdyż
zmienne odnoszą się do dwóch różnych obiektów. W rozdziale 9. pokażę, jak można to naprawić.
218
Rozdział 8. Projektowanie obiektów
Uzyskiwanie wartości mieszających
Często wykorzystywaną operacją podczas programowania w języku C# jest praca z tablicami
mieszającymi (ang. hash tables), które przechowują obiekty w oparciu o ich niezmienne klucze.
Tablice te są również nazywane w innych językach asocjacjami, tablicami asocjacyjnymi lub słow-
nikami. Aby wspomóc tworzenie kluczy, klasa System.Object zawiera metodę GetHashCode
przedstawioną poniżej:
int hashCode = site3.GetHashCode();
W zasadzie nie będziesz wywoływać metody GetHashCode w powyżej przedstawiony sposób,
chyba że zamierzasz zaimplementować swoją własną tablicę mieszającą. Zostanie ona wywołana
podczas użycia klasy Hashtable lub ogólnej klasy Dictionary, co zaprezentowano w roz-
dziale 17., zatytułowanym  Parametryzowanie typów poprzez szablony klas i tworzenie iterato-
rów . Domyślna implementacja metody GetHashCode z klasy System.Object nie gwarantuje
zwracania unikalnej wartości, jednak w rozdziale 9. dowiesz się, jak można zdefiniować własną
metodÄ™ tego typu.
Klonowanie obiektów
Klasa System.Object zawiera także metodę zwaną MemberwiseClone tworzącą kopie obiektów.
Oto przykład:
// element klasy WebSite
public WebSite GetCopy()
{
return MemberwiseClone() as WebSite;
}
Ponieważ metoda MemberwiseClone została zdefiniowana z modyfikatorem protected, musia-
łem wywołać ją z wnętrza klasy WebSite. Oznacza to, że dostęp do tej metody mają tylko klasy
pochodne. Więcej o użyciu modyfikatora protected i innych sposobach definiowania dostępu
dowiesz się w rozdziale 9. Oto kod, który wykorzystuje tę metodę:
WebSite beta = new WebSite();
WebSite site5 = new WebSite();
site5.BetaSite = beta;
WebSite site6 = site5.GetCopy();
bool areSitesEqual = ReferenceEquals(site5, site6);
bool areBetasEqual = ReferenceEquals(site5.BetaSite, site6.BetaSite);
Console.WriteLine("Równo obiektów site: {0}, równo w a ciwo ci beta: {1}",
areSitesEqual, areBetasEqual);
219
Część II Programowanie zorientowane obiektowo w języku C#
Zwróć uwagę na to, że właściwość BetaSite dla obiektu WebSite została ustawiona na wartość
beta. Oznacza to, że obiekt WebSite zawiera pole z referencją do innej instancji klasy WebSite.
Podczas wywołania metody GetCopy, która z kolei wywołuje MemberwiseClone, do zmiennej
site6 przypisany zostaje nowy obiekt będący kopią site5.
Oto coś, co może Cię zaskoczyć: metoda MemberwiseClone przeprowadza tylko płytkie kopio-
wanie. Płytkie kopiowanie wykonuje kopię obiektów wyłącznie na pierwszym poziomie grafu
obiektowego. Obie zmienne site5 i site6 znajdują się właśnie na tym poziomie grafu obiekto-
wego. Instancja beta klasy Website znajduje się jednakże w obiekcie site5 na drugim pozio-
mie grafu obiektowego. Oznacza to, że jedynym elementem, który zostanie skopiowany podczas
wywołania metody MemberwiseClone, będzie referencja przechowywana we właściwości Beta
Site obiektu site5. Tak więc mimo że site5 i site6 są odmiennymi obiektami, które
naprawdę zostały skopiowane, jednakże odwołują się do tego samego obiektu przypisanego do
BetaSite. Poniżej przedstawiony wynik działania kodu potwierdza tę uwagę:
Równo obiektów site: False, równo w a ciwo ci beta: True
Zapamiętaj, że metoda MemberwiseClone wykonuje płytkie kopiowanie. W celu przeprowa-
dzenia głębokiego kopiowania będziesz musiał zaimplementować własną metodę.
Używanie obiektów jako łańcuchów
Być może do tej pory zwróciłeś uwagę na jeden fakt: metodę ToString możesz wywołać dla
dowolnego elementu. Metoda Console.WriteLine wywołuje domyślnie ToString dla każdego
parametru, który zostanie do niej dostarczony. Dzieje się tak, ponieważ ToString jest elementem
klasy System.Object. Oto kilka przykładów:
string siteStr = site6.ToString();
string fiveStr = 5.ToString();
Console.WriteLine("site6: {0}, pi : {1}", siteStr, fiveStr);
Do klasy WebSite nie dołączyliśmy metody ToString, lecz mimo to może ona zostać wywo-
łana. Możesz również wywołać ją dla wartości literalnej, jak zaprezentowano w powyższym
przykładzie w przypadku liczby 5. Oto wynik działania kodu:
site6: Rozdzial_08.WebSite, pi : 5
Wynik działania dla liczby 5 nie jest zaskakujący, lecz zauważ, co uzyskano dla zmiennej site6.
Rozdzial_08 jest przestrzenią nazw programu, której używam w tym rozdziale, a WebSite
jest nazwą klasy. Jest to pełna kwalifikowana nazwa typu, którą domyślnie otrzymasz za pomocą
metody ToString.
220
Rozdział 8. Projektowanie obiektów
Domyślna wartość ToString podczas debugowania programu
Może się zdarzyć, że będziesz debugował swój program lub wydrukujesz wyniki zwracane
przez metodę ToString, i zobaczysz pełną kwalifikowaną nazwę typu. Może to oznaczać,
że obserwujesz lub wykorzystujesz niewłaściwy obiekt.
Na przykład w środowisku ASP.NET możesz do list przypisać obiekty ListItem, które [ Pobierz całość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • bialaorchidea.pev.pl
  •  
    Copyright © 2006 MySite. Designed by Web Page Templates