1 / 41

Mechanizmy dziedziczenia

Języki programowania obiektowego. Mechanizmy dziedziczenia. Andrzej Chybicki Andrzej.Chybicki@eti.pg.gda.pl Pok. 744. General Concept. Typy definiowane przez użytkownika powinny jak najlepiej oddawać rzeczywistość świata modelowanego przez programistę.

taima
Download Presentation

Mechanizmy dziedziczenia

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Języki programowania obiektowego Mechanizmy dziedziczenia Andrzej Chybicki Andrzej.Chybicki@eti.pg.gda.pl Pok. 744

  2. General Concept • Typy definiowane przez użytkownika powinny jak najlepiej oddawać rzeczywistość świata modelowanego przez programistę. • Klasy (obiekty) odzwierciedlają rzeczywiste obiekty • Takie podejście ma umożliwić projektantowi skupienie się na koncepcji problemu, jaki ma dany program rozwiązać, a nie na sposobie działania maszyny obliczeniowej

  3. Klasy • Klasy reprezentują koncepcję problemu i są platformą pomiędzy techniczną zasadą działania komputera a rozwiązywanym zagadnieniem. • Z czasem stało się jasne, że samo mechanizm definiowania klas jest niewystarczający do rozwiązywania niektórych problemów programistycznych

  4. Dziedziczenie • Różne klasy są ze sobą związane, istnieje między nimi związek. Oczywiście można ręcznie implementować ten związek za każdym razem powielając wspólne pola różnych klas czy definiując związki między nimi • Rozwiązaniem tego problemu jest dziedziczenie klas

  5. Przyklad • Mamy firmę i piszemy program odzwierciedlający strukturę osób zatrudnionych w przedsiębiorstwie • Zaczynami od podstawowego stanowiska : Pracownik (klasa Employee) • Następnie dodajemy stanowisko Manager • Jaki jest związek pomiędzy tymi klasami? • Jak zdefiniować za pomocą wbudowanych mechanizmów część wspólną obu klas, co je różni? Która klasa ma dziedziczyć po której?

  6. Przykład (bez dziedziczenia)

  7. Omówienie • Rozwiązanie to powoduje że nie trzeba powielać pól w klasie Manager, jest łatwe do zrozumienia i jasne • Problemy: • W tej interpretacji Manager nie jest Employee, czyli nie można używać zamiennie tych dwóch klas. Trzeba np. osobno implementować funkcje operujące na jednej i na drugiej klasie ( uciążliwe i nieefektywne) • Obiekty Manager nie mogą być wstawiane do tej samej listy co obiekty Employee ( co zrobić z mechanizmem wyszukiwania pracowników firmy – przecież manager to też pracownik!!)

  8. Przykład z dziedziczeniem

  9. Zalety rozwiązania z dziedziczeniem • Klasa manager jest podtypem klasy Employee, więc gdziekolwiek w argumencie podaje się employee tam można też podać jako argument obiekt klasy Manager, ale nie odwrotnie!!

  10. Manager a Employee – ciąg dalszy

  11. Omówienie przykładu i nomenklatura • Klasa Employee jest klasą bazową (ang. Base Class) dla klasy Manager • Klasa Manager jest klasa wywiedzioną klasy Employee (ang. derived from) • Można się spotkać z terminem :Manager jest klasą dziedziczącą po klasie Employee(inherited). • Supeclass i subclass • Klasa Manager posiada te same pola co klasa Employee i dodatkowo pole level

  12. Dostęp do zmiennych i funckji klasy • Public – zawsze dostępna • Private –zmienne i funkcje dostępne tylko dla czlonków klasy (class members) • Protected – zmienne i funkcje dostępne dla członków klasy i klas wywiedzionych

  13. Funkcje wirtualne • Funkcje wirtualne pozwalają na deklarowanie funkcji w klasie bazowej oraz re-definiowanie ich w klasach wywiedzionych. • O tym która z implementacji funkcji wirtualnych zostanie w danym momencie wykonana decyduje typ obiektu z którego funkcja jest wywoływana – spójrzmy na przykład:

  14. Omówienie • Slowo kluczowe virtual oznacza że funkcja print() może slużyć jako interfejs do wywolania funkcji z klasy Employee lub funkcji o tej samej nazwie i ilości argumentów z obiektów klas pochodnych • To kompilator i loader w momencie wywołania danej funkcji dobiera odpowiednią implementację funkcji wirtualnej która zostanie wykonana. • Funckja print() z klasy Manager nadpisuje (overrides) funkcję z klasy Employee

  15. W wyniku otrzymujemySmith1234level2Brown1234

  16. Klasy abstrakcyjne • Wiele klas jest przydatnych zarówno jako klasy zwykle oraz jako klasy będące klasami bazowymi dla innych klas(Employee). Istnieją jednak klasy, które prezentują pewien abstrakcyjny obiekt, którego istnienie nie ma sensu. Dopiero dziedziczenie po takim abstrakcyjnym obiekcie daje w efekcie użyteczny obiekt. Spójrzmy na przykład:

  17. Klasy abstrakcyjne • Taka deklaracja ma sens ale jest bezsensowna i malo elegancka:Shape s; // silly: ‘‘shapeless shape’’

  18. Znacznie lepsze rozwiązanie

  19. Klasy abstrakcyjne - omówienie • „pure virtual functions” są inicjowane za pomocą dopisania do funkcji ciągu znaków „=0” • Klasa, która posiada jedną lub więcej funkcji „pure virtual”, jest klasą abstrakcyjną • Nie można tworzyć obiektów klasy abstrakcyjnej Shape s ; // error: variable of abstract class Shape

  20. Klasa abstrakcyjna może jedynie slużyc jako klasa bazowa

  21. Klasa wywiedziona z klasy abstrakcyjnej może też być klasą abstrakcyjną • A pure virtual function that is not defined in a derived class remains a pure virtual function, so thederived class is also an abstract class. • Sytuację tą ilustruje poniższy przykład:

  22. Wielodziedziczenie (ang. multiple inheritance) • Klasyczne dziedziczenie polega na rozszerzaniu konkretnej – jednej klasy bazowej. Język C umożliwia dziedziczenie po dowolnej ilości klas bazowych class Satellite : public Task , public Displayed { // ... };

  23. Podobnie jak w tradycyjnym dziedziczeniu gdziekolwiek jako argument podajemy jedną z klas bazowych możemy równie dobrze podać jako argument klasę dziedziczącą

  24. Pytania ? ;>

  25. Wielodziedziczenie • Zachowanie funkcji wirtualnych i klas abstrakcyjnych jest analogiczne jak w ‘single inheritance’ • Istotna jest pewna różnica: Klasa wywiedziona jest podklasą dwóch albo więcej klas więc jest podtypem każdej z klas po których dziedziczy.

  26. Wielodziedziczenie a dwuznaczność (ambiguity) • Może się zdarzyć sytuacja w której obie klasy bazowe mają funckje o tej samej nazwie i argumentach. W przypadku gdy w klasie wywiedzionej wywolamy tę funkcję pojawia się problem dwu-znaczności (ambiguity). Spójrzmy na przykład:

  27. Ilustracja problemu dwuznacznościexplicit disambiguation

  28. Inne rozwiązanie • Mechanizm explicit disambiguationjest ‘brzydki’ jak mówi sam autor języka C. Aby rozwiązać powyższy problem z reguly tworzy się metodę nadpisującą w klasie wywiedzionej i w jej ciele implementuje się mechanizm explicit disambiguation. Przedstawia to poniższy przykład:

  29. Wielodziedziczenie • Wraz z umożliwieniem wielodziedziczenia istnieje możliwość dziedziczenia tej samej klasy dwukrotnie. struct Link { Link * next ; }; class Task : public Link { / / the Link is used to maintain a list of all Tasks (the scheduler list) / / ... }; class Displayed : public Link { / / the Link is used to maintain a list of all Displayed objects (the display list) / / ... }; Link Link Task Displayed Satelite

  30. Wielokrotne dziedziczenie a dwuznaczność

  31. Problem wielokrotnego dziedziczenia tej samej klasy bazowej rozwiązuje się poprzez stworzenie najwyższej klasy bazowej klasa wirtualną (virtual base class) • Popatrzmy na kod:

  32. Virtual base class (omówienie)

  33. Interpretacja graficzna Storable Reciever Transmitter Radio

More Related