Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-11 Metody programowania – 1 W4 1
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
"Anatomia i fizjologia" klas - dziedziczenie i polimorfizm
• Specjalizacja i uogólnianie
• Dziedziczenie
• Polimorfizm
• Klasy abstrakcyjne
• Klasy zamknięte
• Klasa główna - Object
Specjalizacja i uogólnianie
Klasy i obiekty (egzemplarze klas) istnieją w sieci zależności i związków (relacji).
Specjalizacja to relacja jest-czymś np. pies jest ssakiem.
Wg tego stwierdzenia pies jest specjalnym rodzajem ssaka – ma wszystkie cechy ssaka, ale oprócz tego jeszcze parę innych właściwych tylko dla psów (canine domesticus).
Kot jest też ssakiem i ma wiele cech wspólnych z psem, ale też kilka właściwych tylko dla kotów.
Do graficznej ilustracji relacji specjalizacji i uogólniania, a ogólnie do opisu systemów często wykorzystuje się tzw. zunifikowany język modelowania (UML – Unified
Modeling Language).
Przykładową relację specjalizacji zapisaną w notacji UML pokazano na rysunku 4.1.
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-11 Metody programowania – 1 W4 3
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Rys.4.1. Relacja jest-czymś
Dziedziczenie
W C# relacja specjalizacji jest realizowana za pomocą dziedziczenia.
Stwierdzenie, że klasa ListBox dziedziczy po klasie Control oznacza, że klasa ListBox jest wyspecjalizowaną wersją klasy Control.
Klasę Control nazywa się klasą bazowąa klasę ListBox – klasą pochodnąlub potomną.
Klasa ListBox dziedziczy cechy i zachowania klasy Control, ale oprócz tego może posiadać też wyspecjalizowane składowe.
Przykład klasy bazowej i klasy potomnej pokazuje listing 4.1.
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-11 Metody programowania – 1 W4 5
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-11 Metody programowania – 1 W4 7
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Polimorfizm
Najważniejszym aspektem dziedziczenia jest polimorfizm.
Oznacza on możliwość używania typu w wielu formach, niezależnie od szczegółów klas.
Aby utworzyć metodę polimorficzną, należy ją oznaczyć jako wirtualnąw klasie bazowej.
W przykładzie 4.1 taką metodą polimorficzną jest metoda Wyświetl, której nazwa w klasie bazowej PUNKT_2D została poprzedzona słowem kluczowym virtual.
Dzięki temu w każdej klasie potomnej można umieścić nową wersję tej metody.
W klasie PUNKT_3D znalazła się metoda Wyświetl przeznaczona do wyświetlania
współrzędnych punktu w przestrzeni trójwymiarowej. W deklaracji tej metody pojawiło się słowo kluczowe override, które powoduje, że metoda w klasie potomnej o takiej samej nazwie jak metoda w klasie bazowej "przesłania" metodę bazową.
Słowo base w definicji konstruktora klasy potomnej oznacza wykorzystanie konstruktora bazowego jako części konstruktora obiektu klasy potomnej.
Uwaga! Słowo base odwołujące się do konstruktora klasy bazowej umieszczono po znaku dwukropka, co oznacza, że konstruktor klasy potomnej dziedziczy metodę konstruktora bazowego.
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-11 Metody programowania – 1 W4 9
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-11 Metody programowania – 1 W4 11
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Przykład wykorzystania polimorfizmu przedstawia listing 4.2.
W tablicy zbiórzadeklarowanej jako kolekcja obiektów klasy bazowej Kontrolka umieszczono zarówno obiekt klasy bazowej jak i obiekty obydwu klas potomnych.
System prawidłowo rozpoznał i wybrał odpowiednią metodę wirtualną do wyświetlenia informacji o konkretnym obiekcie.
W metodzie Wyświetl, która w klasie potomnej Lista przesłania metodę Wyświetl klasy bazowej, użyto słowa kluczowego base do odwołania się do metody z klasy bazowej, a ta jest tutaj częścią definicji metody wirtualnej.
Klasy potomne nie dziedziczą konstruktorów.
W konstruktorze klasy pochodnej konieczne jest jawne wywołanie konstruktora klasy bazowej. W przypadku konstruktora domyślnego robi to automatycznie kompilator.
Każdy konstruktor jawny w klasie potomnej musi wywoływać jeden z konstruktorów klasy bazowej. Do tego celu wykorzystuje się słowo kluczowe base.
Klasy abstrakcyjne
W przykładzie pokazanym na listingu 4.2 każda klasa potomna klasy Kontrolka powinna zawierać własną wersję metody Wyświetl.
W pokazanym przykładzie nie istnie mechanizm, który zmusiłby programistę do takiego postępowania.
Aby wymusić tworzenie nowych wersji metod klasy bazowej, należy oznaczyć taką metodę jako abstrakcyjną za pomocą słowa kluczowego abstract.
Umieszczenie w klasie przynajmniej jednej metody abstrakcyjnej powoduje, że cała klasa staje się abstrakcyjna.
Klasy abstrakcyjne stanowią bazę dla klas pochodnych.
W programie nie można tworzyć obiektów klas abstrakcyjnych.
Przykład definicji i użycia klasy abstrakcyjnej przedstawia listing 4.3.
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-11 Metody programowania – 1 W4 13
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-11 Metody programowania – 1 W4 15
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-11 Metody programowania – 1 W4 17
Metody programowania – 1 dr inż. Tadeusz Jeleniewski
Klasy zamknięte
Klasy zamkniętestanowią przeciwieństwo klas abstrakcyjnych.
Od klas zamkniętych nie można tworzyć klas pochodnych.
Tworzeniu klas pochodnych zapobiega słowo kluczowe sealed umieszczone przed deklaracją klasy.
Stosuje się ten sposób, aby zapobiec przypadkowemu dziedziczeniu.
Próba utworzenia klasy potomnej w stosunku do klasy oznaczonej jako
"zapieczętowana" powoduje przerwanie kompilacji z komunikatem informującym o niemożności dziedziczenia.
Klasa główna - Object
Wszystkie klasy języka C# są klasami pochodnymi od klasy System.Object(dotyczy to także typów skalarnych).
Klasa Object udostępnia wiele metod wirtualnych, które mogą być przesłaniane w klasach potomnych. Przykładami są metody Equals(), GetType(), ToString().
W tabeli 4.1 zestawiono metody klasy Object.
Metoda Działanie
Equals() Sprawdza czy dwa obiekty są sobie równe
GetHashCode() Pozwala obiektom udostępnić własną funkcję haszującą, używaną w kolekcjach
GetType() Pozwala sprawdzić typ obiektu
ToString() Zwraca łańcuch znaków reprezentujący obiekt
Finalize() Porządkuje zasoby inne niż pamięć. Implementowana za pomocą destruktora.
MemberwiseClone() Tworzy kopie obiektu. Nie można jej przesłonić w klasach definiowanych przez użytkownika
Wyższa Szkoła Techniczno – Ekonomiczna w Świdnicy
2016-11-11 Metody programowania – 1 W4 19
Metody programowania – 1 dr inż. Tadeusz Jeleniewski