|
|
 |
|
 |
 |
[ 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.pldoc.pisz.plpdf.pisz.plbialaorchidea.pev.pl
|
|
|