Tomasz Marks - Wydział MiNI PW
-1-
Programowanie Obiektowe
(j
ę
zyk C++)
Wykład 15.
Tomasz Marks - Wydział MiNI PW
-2-
hierarchie klas
i
wielodziedziczenie
Tomasz Marks - Wydział MiNI PW
-3-
Hierarchie klas
Dziedziczenie wprowadza relacj
ę
pokrewie
ń
stwa pomi
ę
dzy klasami.
W najprostrzym przypadku mamy do czynienia z dziedziczeniem pomi
ę
dzy
dwiema klasami, co jest opisane zdaniem:
klasa B dziedziczy po klasie A
i co wyra
ż
amy graficznie:
Zbiór klas pokrewnych nazywa si
ę
zwyczajowo hierarchi
ą
klas.
Hierarchia klas mo
ż
e by
ć
zwykle przedstawiona struktur
ą
drzewa lub w bardziej
skomplikowanych przypadkach struktur
ą
grafu:
Tomasz Marks - Wydział MiNI PW
-4-
Hierarchie klas i wielodziedziczenie
Z wielodziedziczeniem mamy do czynienia w sytuacji, gdy klasa dziedziczy
po wi
ę
cej ni
ż
jednej klasie ( ma wi
ę
cej ni
ż
jedn
ą
klas
ę
bazow
ą
).
N.p. jest tak w przypadku klas F, H i M, N na poni
ż
szym rysunku:
Tomasz Marks - Wydział MiNI PW
-5-
Wielodziedziczenie (1)
struct T
//triangle
{
int tcolor;
T( int tc=0 ) : tcolor( tc ) { }
virtual void draw( )
{
cout << " triangle:" << tcolor;
}
};
struct TB : T
//triangle with border
{
int bcolor;
TB( int tc, int bc ) : T( tc ), bcolor( bc ) { }
void draw( )
{
T::draw( );
cout << " border:" << bcolor;
}
};
Tomasz Marks - Wydział MiNI PW
-6-
Wielodziedziczenie (2)
struct TC : T
//triangle with center
{
int ccolor;
TC( int tc, int cc ) : T( tc ), ccolor( cc ) { }
void draw( )
{
T::draw( );
cout << " center:" << ccolor;
}
};
struct TBC : TB, TC
//triangle with border and center
{
TBC( int tc, int bc, int cc ) : TB( tc ,bc ), TC( tc, cc ) { }
void draw( )
{
TB::draw( );
TC::draw( );
}
void info( )
{
//cout << tcolor; //
BLAD!
tcolor niejednoznaczne
cout << TB::tcolor;
cout << TC::tcolor;
cout << bcolor << ccolor;
}
};
Tomasz Marks - Wydział MiNI PW
-7-
Wielodziedziczenie (3)
int main ( )
{
TBC tr( 1, 2, 3 );
tr.info( );
// 1 1 2 3
tr.draw( );
// triangle:1 border:2 triangle:1 center:3
//tr.tcolor = 4; //
BLAD!
tcolor niejednoznaczne
tr.TB::tcolor = 5;
tr.TC::tcolor = 6;
tr.info( );
// 5 6 2 3
tr.draw( );
// triangle:5 border:2 triangle:6 center:3
}
Komentarz:
Obiekt tr faktycznie zawiera dwa trójk
ą
ty ( b
ę
d
ą
ce podobiektami typu T
zawartymi w składowych typów TB i TC ), które mog
ą
mie
ć
ró
ż
ne kolory,
co jest sprzeczne z intencjami projektowymi.
Aby usun
ąć
ten kłopot mo
ż
na zastosowa
ć
wirtualne dziedziczenie bazy T
(patrz nast
ę
pny przykład).
Tomasz Marks - Wydział MiNI PW
-8-
Wielodziedziczenie (4)
Komentarz:
Aby usun
ąć
ten kłopot mo
ż
na zastosowa
ć
wirtualne dziedziczenie bazy T
(patrz nast
ę
pny przykład).
Hierarchia klas
zrealizowana: oczekiwana:
Tomasz Marks - Wydział MiNI PW
-9-
Wielodziedziczenie – baza wirtualna (1)
struct T
//triangle
{
int tcolor;
T( int tc=0 ) : tcolor( tc ) { }
virtual void draw( )
{
cout << " triangle:" << tcolor;
}
};
struct TB :
virtual
T
//triangle with border
{
int bcolor;
TB( int tc, int bc ) : T( tc ), bcolor( bc ) { }
void draw( )
{
T::draw( );
cout << " border:" << bcolor;
}
};
Tomasz Marks - Wydział MiNI PW
-10-
Wielodziedziczenie – baza wirtualna (2)
struct TC :
virtual
T
//triangle with center
{
int ccolor;
TC( int tc, int cc ) : T( tc ), ccolor( cc ) { }
void draw( )
{
T::draw( );
cout << " center:" << ccolor;
}
};
struct TBC : TB, TC
//triangle with border and center
{
TBC( int tc, int bc, int cc ) :
T( tc ),
TB( tc, bc ), TC( tc, cc ) { }
void draw( )
{
TB::draw( );
TC::draw( );
}
void info( )
{
cout << tcolor;
// teraz O.K.
cout << TB::tcolor;
cout << TC::tcolor;
cout << bcolor << ccolor;
}
};
Tomasz Marks - Wydział MiNI PW
-11-
Wielodziedziczenie – baza wirtualna (3)
int main ( )
{
TBC tr( 1, 2, 3 );
tr.info( );
// 1 1 1 2 3
tr.draw( );
// triangle:1 border:2 triangle:1 center:3
tr.tcolor = 4;
// teraz O.K.
tr.TB::tcolor = 5;
tr.TC::tcolor = 6;
tr.info( );
// 6 6 6 2 3
tr.draw( );
// triangle:6 border:2 triangle:6 center:3
}
Komentarz:
Obiekt tr zawiera teraz tylko jeden trójk
ą
t ( b
ę
d
ą
cy wirtualnie dziedziczonym
podobiektem typu T w składowych typów TB i TC ). W ten sposób nie ma
ju
ż
sprzeczno
ś
ci z intencjami projektowymi.
Ale metoda TBC::draw wypisuje dwa razy informacj
ę
o trójk
ą
cie bazowym.
Ten kłopot usuniemy przez wprowadzenie w ka
ż
dej klasie metody Draw,
która wyprowadza tylko informacje specyficzne dla tej klasy
(patrz nast
ę
pny przykład).
Tomasz Marks - Wydział MiNI PW
-12-
Wielodziedziczenie – baza wirtualna (1a)
struct T
//triangle
{
int tcolor;
T( int tc=0 ) : tcolor( tc ) { }
void Draw( )
{
cout << " triangle:" << tcolor;
}
virtual void draw ( ) { Draw( ); }
};
struct TB : virtual T
//triangle with border
{
int bcolor;
TB( int tc, int bc ) : T( tc ), bcolor( bc ) { }
void Draw( ) { cout << " border:" << bcolor; }
void draw( )
{
T::Draw();
Draw( );
}
};
Tomasz Marks - Wydział MiNI PW
-13-
Wielodziedziczenie – baza wirtualna (2a)
struct TC : virtual T
//triangle with center
{
int ccolor;
TC( int tc, int cc ) : T( tc ), ccolor( cc ) { }
void Draw( ) { cout << " center:" << ccolor; }
void draw( )
{
T::Draw();
Draw( );
}
};
struct TBC : TB, TC
//triangle with border and center
{
TBC( int tc, int bc, int cc ) : T( tc ), TB( tc, bc ), TC( tc, cc ) { }
void Draw( ) { cout << " ....."; }
void draw( )
{
T::Draw( ); TB::Draw(); TC::Draw();
Draw( );
}
};
Tomasz Marks - Wydział MiNI PW
-14-
Wielodziedziczenie – baza wirtualna (3a)
int main ( )
{
TBC tr( 1, 2, 3 );
tr.draw( );
// triangle:1 border:2 center:3 .....
tr.tcolor = 4;
// teraz O.K.
tr.TB::tcolor = 5;
tr.TC::tcolor = 6;
tr.draw( );
// triangle:6 border:2 center:3 .....
}
Komentarz:
Metoda TBC::info została usuni
ę
ta, bo nic nowego tu nie poka
ż
e.
Metoda TBC::draw wypisuje teraz ka
ż
d
ą
potrzebn
ą
informacj
ę
o trójk
ą
cie
tylko jeden raz, korzystaj
ą
c ze specyficznych wersji metody Draw
okre
ś
lonych w poszczególnych klasach.
Tomasz Marks - Wydział MiNI PW
-15-
paradygmat
obiektowy
Tomasz Marks - Wydział MiNI PW
-16-
Co to jest Paradygmat ?
•
W
Oxford English Dictionary
paradygmat jest zdefiniowany jako
wzorzec lub najogólniejszy model lub jako wzorcowy przykład.
•
Paradygmat ... -
w rozumieniu wprowadzonym przez
filozofa Thomasa
Kuhna
w ksi
ąż
ce Struktura rewolucji naukowych (The Structure of Scientific
Revolutions) opublikowanej w
1962
r.
... to zbiór poj
ęć
i teorii tworz
ą
cych podstawy danej nauki.
•
Teorii i poj
ęć
tworz
ą
cych paradygmat raczej si
ę
nie kwestionuje,
przynajmniej do czasu kiedy paradygmat jest twórczy poznawczo -
tzn. za jego pomoc
ą
mo
ż
na tworzy
ć
teorie szczegółowe zgodne z
danymi do
ś
wiadczalnymi (historycznymi), którymi zajmuje si
ę
dana
nauka.
Tomasz Marks - Wydział MiNI PW
-17-
Podstawowe zało
ż
enia
paradygmatu obiektowego
Powszechnie uwa
ż
a si
ę
,
ż
e najwa
ż
niejsze s
ą
nast
ę
puj
ą
ce cechy:
• Abstrakcja
• Enkapsulacja (hermetyzacja)
• Polimorfizm
• Dziedziczenie
Tomasz Marks - Wydział MiNI PW
-18-
Abstrakcja
•
Rozpatrujemy pewien system rozumiany jako układ obiektów.
•
Ka
ż
dy obiekt w systemie mo
ż
na rozpatrywa
ć
jako model
abstrakcyjnego elementu, który mo
ż
e:
– opisywa
ć
i zmienia
ć
swój stan,
– komunikowa
ć
si
ę
z innymi obiektami w systemie,
– wykonywa
ć
pewne czynno
ś
ci na rzecz innych obiektów,
bez ujawniania, w jaki sposób zaimplementowano dane cechy.
UWAGA: Procesy, funkcje i/lub metody mog
ą
by
ć
równie
ż
abstrahowane.
W taki przypadku konieczne s
ą
ró
ż
ne techniki rozszerzania abstrakcji.
Tomasz Marks - Wydział MiNI PW
-19-
Enkapsulacja (hermetyzacja)
•
Polega na ukrywaniu szczegółów implementacji.
•
Ma to zapewni
ć
,
ż
e obiekt nie mo
ż
e zmienia
ć
stanu wewn
ę
trznego
innych obiektów w nieoczekiwany sposób.
•
Tylko wewn
ę
trzne metody obiektu s
ą
uprawnione do zmiany jego stanu.
•
Ka
ż
dy typ obiektu dostarcza innym obiektom swój "interfejs", który
okre
ś
la dopuszczalne metody współpracy.
UWAGA: Pewne j
ę
zyki programowania (n.p. C++) nie realizuj
ą
tego
zało
ż
enia zbyt rygorystycznie, dopuszczaj
ą
c pewien poziom
bezpo
ś
redniego dost
ę
pu do szczegółów implementacyjnych obiektu.
Prowadzi to do ograniczenia poziomu abstrakcji.
Tomasz Marks - Wydział MiNI PW
-20-
Polimorfizm (1)
•
W krystalografii: Polimorfizm (ró
ż
nopostaciowo
ść
) – zjawisko
wyst
ę
powania ró
ż
nych odmian tej samej substancji. Wyst
ę
puje ono
wtedy, gdy ta sama substancja mo
ż
e wyst
ę
powa
ć
w dwóch lub
nawet kilku formach krystalicznych.
•
W takim sensie mo
ż
na uwa
ż
a
ć
,
ż
e polimorfizm
jest opisany stwierdzeniem: " B i C s
ą
A" dla
klas B i C dziedzicz
ą
cych z klasy:
•
W programowaniu rozumie si
ę
to na ogół w w
ęż
szym sensie,
patrz nast
ę
pna strona:
Tomasz Marks - Wydział MiNI PW
-21-
Polimorfizm (2)
•
Referencje i kolekcje obiektów mog
ą
dotyczy
ć
obiektów ró
ż
nego
typu, a wywołanie metody dla referencji spowoduje zachowanie
odpowiednie dla pełnego typu obiektu wywoływanego.
•
Polimorfizm w programowaniu obiektowym to wykazywanie ró
ż
nych
form działania podczas wywoływania metody w zale
ż
no
ś
ci od tego
jakiego typu obiekt jest wskazywany przez wska
ź
nik lub referencj
ę
.
•
Typ z funkcjami wirtulnymi nazywa si
ę
typem polimorficznym
(B. Stroustrup str. 345)
UWAGA:
Polimorfizm
dotyczy kilku podklas tej samej klasy bazowej,
które maj
ą
metody o takiej samej sygnaturze lecz ró
ż
nych
implementacjach.
Przeci
ąż
anie
dotyczy metod tej samej klasy, które
maj
ą
t
ę
sam
ą
nazw
ę
, lecz ró
ż
ne sygnatury.
Tomasz Marks - Wydział MiNI PW
-22-
Dziedziczenie
•
Dziedziczenie porz
ą
dkuje i wspomaga polimorfizm i enkapsulacj
ę
.
•
Osi
ą
ga to dzi
ę
ki umo
ż
liwieniu definiowania i tworzenia specjalizowanych
obiektów na podstawie bardziej ogólnych.
•
Dla obiektów specjalizowanych nie trzeba redefiniowa
ć
całej
funkcjonalno
ś
ci, lecz tylko t
ę
, której nie maj
ą
obiekty ogólniejsze.
UWAGA: W typowych przypadkach powstaj
ą
grupy obiektów zwane
klasami, oraz grupy klas zwane drzewami. Odzwierciedlaj
ą
one wspólne
cechy obiektów.
Tomasz Marks - Wydział MiNI PW
-23-
Koniec wykładu 15.