programowanie obiektowe


Dziedziczenie

Przegląd zagadnień

0x08 graphic

Tematem tego modułu jest dziedziczenie klas. Omówiona zostanie istota tego mechanizmu, przedstawiony sposób jego implementacji języku C#. Wskazana będzie też rola modyfikatorów dostępu.

Następnie przedstawione zostanie przesłanianie metod, co będzie pierwszym krokiem do poznania mechanizmu przeciążania metod na kolejnych zajęciach.

W dalszej części wprowadzone zostaną pojęcia klasy zamkniętej oraz zagnieżdżania klas.

Przykłady w języku C# będą uzupełniane schematami klas w notacji UML.

Po podsumowaniu i pytaniach sprawdzających zdobytą wiedzę, studenci wykonają samodzielnie ćwiczenia.

Istota dziedziczenia

0x08 graphic

Na dotychczasowych zajęciach, mówiąc o klasach i obiektach, wskazaliśmy na istnienie pewnej hierarchii klas - możemy wyróżniać klasy nadrzędne, ogólniejsze, oraz klasy bardziej szczegółowe.

Dla przykładu, słuchacze kursu należą do klasy student, a klasa student należy do klasy osoba. Dąb w parku jest obiektem klasy drzewo liściaste, a także klasy drzewo, roślina. Jak widać, hierarchia klas może mieć wiele poziomów.

W programowaniu obiektowym można przedstawić tę sytuację za pomocą dziedziczenia. Dziedziczenie pozwala na zdefiniowanie klasy, która przejmuje strukturę klasy bazowej. Klasa, która dziedziczy zmienne i metody składowe z innej klasy, nazywana jest klasą pochodną.

Dziedziczenie klas (1)

0x08 graphic

Zobaczmy to na przykładzie. Składowymi klasy Osoba może być nazwisko, numer PESEL, umiejętność przedstawienia się. Osobą jest też Student - klasa ta powinna mieć taką samą strukturę jak Osoba, lecz dodatkowo posiada numer indeksu.

W języku C# definiujemy klasę Osoba wraz z jej składowymi. Nie sprawia to trudności. Następnie definiujemy klasę Student zaznaczając, że dziedziczy z klasy bazowej Osoba - robimy to umieszczając nazwę klasy bazowej po dwukropku.

W definicji klasy pochodnej umieszczamy dodatkowe składowe, jak w tym przypadku zmienną NumerIndeksu.

W notacji UML dziedziczenie oznaczamy strzałką z pustym grotem.

Dziedziczenie klas (2)

0x08 graphic

Zobaczmy teraz, jaki będzie efekt przedstawionego kodu. Tworzymy instancję klasy Student o nazwie Wieczny. Obiekt ten ma naturalnie zmienną składową NumerIndeksu, a ponieważ jest również klasy Osoba (bo klasa Student dziedziczy po klasie Osoba), obiekt Wieczny ma również składowe klasy Osoba, czyli Nazwisko, Pesel i metodę Przedstaw().

Zwróćmy uwagę, że wszystkie te składowe są publiczne, dlatego nie ma problemu z dostępem do każdej z nich.

Dziedziczenie klas (3)

0x08 graphic

Jak powiedziano na poprzednich zajęciach, dostęp do składowych można kontrolować za pomocą modyfikatorów dostępu. Możemy wskazać składowe, do których dostęp będzie możliwy zarówno z kodu klasy jak i spoza niej - za pomocą modyfikatora public. Modyfikator private zezwala na dostęp tylko wewnątrz klasy.

Z kolei modyfikator protected pozwala na dostęp tylko wewnątrz klasy oraz z klasy dziedziczącej po tej klasie. Na schemacie klas taką składową oznaczamy krzyżykiem #.

W przedstawionym przykładzie tworzymy klasę Bilet. Klasa ma publiczną metodę PodajCenę, obliczającą i wypisującą do konsoli cenę brutto biletu, natomiast cena netto biletu i stawka VAT jest niedostępna spoza klasy. Jedynie CenaNetto, oznaczona modyfikatorem protected, jest dostępna w klasach dziedziczących po klasie Bilet.

Klasa pochodna BiletUlgowy ma dodatkowo konstruktor, przyjmujący jako parametr. Ma być nim ułamek mówiący o cenie biletu po odjęciu zniżki. Konstruktor ma dostęp do chronionej (protected) zmiennej składowej klasy Bilet, nie może jednak korzystać ze zmiennej prywatnej.

Dziedziczenie klas (4)

0x08 graphic

Spójrzmy, jak zachowują się instancje klas Bilet i BiletUlgowy. Z obu obiektów możemy wywołać publiczną metodę klasy Bilet. Nie wolno jednak odwoływać się do prywatnych i chronionych zmiennych składowych.

Przesłanianie

0x08 graphic

Przyjmijmy, że w pochodnej klasie chcemy stworzyć metodę o nazwie, która jest już nazwą metody w klasie bazowej. Jest to możliwe, jednak spowoduje zgłoszenie przez kompilator ostrzeżenia.

Aby tego uniknąć, korzystamy z mechanizmu przesłaniania dodając przed definicją metody słowo kluczowe new. Informuje to kompilator, że tworzymy nową metodę o tej samej nazwie, ukrywając metodę klasy bazowej.

W tym przykładzie tworzymy nową metodę PodajCene(), która wyświetla uwagę, że podana cena dotyczy biletu ulgowego. Chcemy jednak przy tym skorzystać z istniejącej już w klasie bazowej metody PodajCene() - jest to możliwe przy użyciu słowa base.

Słowo base reprezentuje w klasie pochodnej obiekt klasy bazowej.

Klasy zamknięte

0x08 graphic

Aby dodatkowo zabezpieczyć kod programu przed nieprzewidzianym użyciem, w języku C# możemy zastrzec, że określona klasa nie może być dziedziczona. Robimy to dodając słowo sealed przed definicją zabezpieczanej klasy - oznaczamy tak klasę jako zamkniętą (zaplombowaną).

Nie można utworzyć klasy pochodnej, używając jako klasy bazowej klasy zamkniętej. Taka próba zakończy się komunikatem o błędzie.

Zagnieżdżanie klas

0x08 graphic

Mechanizmem innym niż dziedziczenie, pozwalającym na włączenie funkcjonalności jednej klasy do drugiej, jest zagnieżdżanie klas. Zagnieżdżanie pozwala na umieszczenie wewnątrz klasy definicji innej klasy, a następnie tworzenie jej instancji - obiektu składowego.

Do klasy zagnieżdżonej nie ma dostępu z innych obiektów - istnieje ona tylko na użytek klasy, w której została umieszczona. Na slajdzie przedstawiony jest przykład zdefiniowania klasy zagnieżdżonej Silnik wewnątrz klasy Pojazd.

Poniżej pokazane są dwa schematy UML. Pierwszy ilustruje zagnieżdżoną definicję klasy Silnik wewnątrz klasy Pojazd. Zagnieżdżenie jest oznaczane strzałką zakończoną kółkiem z krzyżykiem.

Druga przedstawia relację, w której klasa składowa Silnik nie może istnieć poza klasą Pojazd, w której została umieszczona. Relacja ta nazywa się kompozycją i oznacza się ją strzałką zakończoną wypełnionym rombem.

Podsumowanie

0x08 graphic

Podczas zajęć został przedstawiony mechanizm dziedziczenia, będący jedną z najważniejszych cech programowania obiektowego. Omówiono zasada jego działania oraz sposób implementacji kodu w języku C#.

Zwrócona została uwaga na rolę modyfikatorów dostępu do składowych klasy, w szczególności modyfikatora protected. Ponadto przedstawiono możliwość przesłaniania metod klasy bazowej przez metody klasy pochodnej za pomocą słowa new.

Dodatkowo wskazano na możliwość zamknięcia klasy i uniemożliwienia jej dziedziczenia, a na zakończenie inną relację między klasami - zagnieżdżanie.

Pytania sprawdzające

0x08 graphic

Pytania sprawdzające wiedzę przyswojoną przez studentów na tych zajęciach:

  1. Czym jest hierarchia klas?

  2. Jak na dziedziczenie wpływają modyfikatory dostępu public, protected i private?

  3. Na czym polega przesłanianie?

  4. Jak zabezpieczyć klasę przed dziedziczeniem?

  5. Porównaj obiekt składowy klasy i zagnieżdżoną klasę wewnętrzną.

Laboratorium

0x08 graphic

W pozostałym czasie, studenci samodzielnie wykonują zadania wykorzystując poznane możliwości programowania obiektowego w języku C#.

  1. Korzystając z dziedziczenia, przedstaw hierarchię klas reprezentujących drzewa. Dodaj do klas odpowiednie składowe i utwórz kilka instancji. Obejrzyj utworzone klasy na diagramie klas.

  2. Za pomocą poznanych mechanizmów przedstaw za pomocą klas model hierarchii przedsiębiorstw, instytucji lub organizacji, dodając odpowiednie składowe. Spróbuj uwzględnić rolę ludzi w tych organizacjach. Obejrzyj utworzone klasy na diagramie klas.

  3. Wykorzystując kod stworzony na dotychczasowych zajęciach, stwórz klasę nowej wersji łazika marsjańskiego, dziedzicząc przydatne składowe po klasie pojazd. Obejrzyj utworzone klasy na diagramie klas.

L

L



Wyszukiwarka

Podobne podstrony:
Programowanie obiektowe(ćw) 1
Zadanie projekt przychodnia lekarska, Programowanie obiektowe
Programowanie obiektowe w PHP4 i PHP5 11 2005
Programowanie Obiektowe ZadTest Nieznany
Egzamin Programowanie Obiektowe Głowacki, Programowanie Obiektowe
Jezyk C Efektywne programowanie obiektowe cpefpo
Programowanie Obiektowe Ćwiczenia 5
Programowanie obiektowe(cw) 2 i Nieznany
programowanie obiektowe 05, c c++, c#
Intuicyjne podstawy programowania obiektowego0
Programowanie obiektowe, CPP program, 1
wyklad5.cpp, JAVA jest językiem programowania obiektowego
projekt01, wisisz, wydzial informatyki, studia zaoczne inzynierskie, programowanie obiektowe, projek
przeciazanie metod i operatorow, Programowanie obiektowe
projekt06, wisisz, wydzial informatyki, studia zaoczne inzynierskie, programowanie obiektowe, projek
projekt07, wisisz, wydzial informatyki, studia zaoczne inzynierskie, programowanie obiektowe, projek
Programowanie Obiektowe Cz2, Dziedziczenie proste
Programowanie obiektowe, w2, 2
Programowanie obiektowe, wyklad6-czesc1, Dziedziczenie wielobazowe

więcej podobnych podstron