Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
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!!
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:
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:
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:
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 { // ... };
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ą
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:
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
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.