Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Mechanizmy dziedziczenia

Podobne prezentacje


Prezentacja na temat: "Mechanizmy dziedziczenia"— Zapis prezentacji:

1 Mechanizmy dziedziczenia
Języki programowania obiektowego Mechanizmy dziedziczenia Andrzej Chybicki 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

11 Manager a Employee – ciąg dalszy

12 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

13 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

14 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:

15

16

17 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

18 W wyniku otrzymujemy Smith1234 level2 Brown1234

19 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:

20

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

22 Znacznie lepsze rozwiązanie

23 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

24 Klasa abstrakcyjna może jedynie slużyc jako klasa bazowa

25 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 the derived class is also an abstract class. Sytuację tą ilustruje poniższy przykład:

26

27 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 { // ... };

28

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

30

31 Pytania ? ;>

32 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.

33 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:

34 Ilustracja problemu dwuznaczności explicit disambiguation

35 Inne rozwiązanie Mechanizm explicit disambiguation jest ‘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:

36

37 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

38 Wielokrotne dziedziczenie a dwuznaczność

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

40 Virtual base class (omówienie)

41 Interpretacja graficzna
Storable Reciever Transmitter Radio


Pobierz ppt "Mechanizmy dziedziczenia"

Podobne prezentacje


Reklamy Google