Sposoby obejścia dziedziczenia

1 Sposoby obejścia dziedziczeniaBraki specyficznych rodza...
Author: Wisia Sadlak
0 downloads 2 Views

1 Sposoby obejścia dziedziczeniaBraki specyficznych rodzajów dziedziczenia można obejść wprowadzając dodatkowe: kompozycje asocjacje agregacje Każdy z tych związków reprezentuje się za pomocą atrybutów w klasach.

2 Sposoby obejścia dziedziczeniaNajprostszy przypadek: kompozycja Kompozycję implementujemy poprzez umieszczenie odpowiedniego odnośnika wewnątrz klasy. SAMOCHÓD class Samochód { Silnik s; .... } SILNIK

3 Overlapping Overlapping – przecięcie zbiorów podklas nie jest zbiorem pustym. Pojazd { overlapping } Pojazd lądowy Pojazd wodny

4 Overlapping Obejście poprzez wprowadzenie dodatkowej klasy zawierającej sumę atrybutów innych podklas. Pojazd {disjoint, complete} Pojazd lądowy Pojazd wodny Pojazd wodno - lądowy

5 Overlapping Wady rozwiązania:konieczność tworzenia nowej klasy dla każdego pojazdu. dodawanie nowej klasy – pociąga za sobą tworzenie dużej ilości klas łączących poszczególne kategorie szybkie rozrastanie się hierarchii klas

6 Wielodziedziczenie (multi inheritance)Wielodziedziczenie – możliwość przejęcia inwariantów (pól i metod) z więcej niż jednej nadklasy. Występuje w języku C++, w Javie trzeba stosować rozwiązania zastępcze.

7 Przykład wielodziedziczeniaStandardowa notacja UML: POJAZD { overlapping } POJAZD LĄDOWY POJAZD WODNY AMFIBIA

8 Wielodziedziczenie Jeżeli nie są wymagane szczegółowe informacje, można w ogóle zrezygnować z dziedziczenia. rezygnacja z podklas wprowadzenie dodatkowych atrybutów i metod POJAZD jezdzi() plywa()

9 Wielodziedziczenie Konstrukcja pozwalająca obejść brak wielodziedziczenia – zastąpienie przez kompozycję POJAZD Nazwa pojazdu 0..1 0..1 WŁAŚCIWOŚCI POJAZDU WODNEGO WŁAŚCIWOŚCI POJAZDU LĄDOWEGO Takie relacje pomiędzy klasami można zaimplementować w Javie.

10 Wielodziedziczenie – realizacja w JavieWskazane jest, aby klasy Właściwości Pojazdu Lądowego i Właściwości pojazdu wodnego zostały zrealizowane jako klasy wewnętrzne klasy Pojazd. class Pojazd { String nazwa; WlPojLad wl; // może być null WlPojWod ww; // może być null class WlPojLad { double ladV; // predkosc na lądzie } class WlPojWod { double wodV; // predkosc w wodzie double wypornosc;

11 Wielodziedziczenie – realizacja w JavieKlasa Pojazd w tym przykładzie powinna być zaopatrzona w kilka konstruktorów w zależności od typu pojazdu. Pojazd(WlPojLad wl) { this.wl = wl; } Pojazd(WlPojWod ww) { this.ww = ww; Pojazd(WlPojLad wl, WlPojWod ww) {

12 Wielodziedziczenie – wady rozwiązaniaPOJAZD POJAZD LĄDOWY POJAZD WODNY POJAZD POWIETRZNY Problemy pojawiają się gdy do istniejącej hierarchii klas dodajemy nową.

13 Wielodziedziczenie – wady rozwiązaniaw przypadku dodawania nowej podklasy (pojazd powietrzny) – konieczna modyfikacja kodu nadklasy class Pojazd { WlPojLad wl; WlPojWod ww; WlPojPow wp; class WlPojLad {...} class WlPojWod {...} class WlPojPow { .... } nowy odnośnik nowa klasa wewnętrzna

14 Wielodziedziczenie – wady rozwiązaniaWady poprzedniego rozwiązania tzn. konieczność modyfikacji kodu już napisanych klas można obejść stosując następującą hierarchię: POJAZD WŁAŚCIWOŚCI POJAZDU WŁAŚCIWOŚCI POJAZDU LĄDOWEGO WŁAŚCIWOŚCI POJAZDU WODNEGO WŁAŚCIWOŚCI POJAZDU POWIETRZNEGO