hierarchie klas

Programowanie Obiektowe

(język C++)

i

wielodziedziczenie

Wykład 15.

Tomasz Marks - Wydział MiNI PW

-1-

Tomasz Marks - Wydział MiNI PW

-2-

Hierarchie klas

Hierarchie klas i wielodziedziczenie

Dziedziczenie wprowadza relację pokrewień stwa pomię dzy klasami.

W najprostrzym przypadku mamy do czynienia z dziedziczeniem pomię dzy dwiema klasami, co jest opisane zdaniem:

Z wielodziedziczeniem mamy do czynienia w sytuacji, gdy klasa dziedziczy po wię cej niŜ jednej klasie ( ma wię cej niŜ jedną klasę bazową ).

klasa B dziedziczy po klasie A

N.p. jest tak w przypadku klas F , H i M , N na poniŜ szym rysunku: 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

-3-

Tomasz Marks - Wydział MiNI PW

-4-

Wielodziedziczenie (1)

Wielodziedziczenie (2)

struct TC : T //triangle with center

struct T //triangle

{

{

int ccolor;

int tcolor;

TC( int tc, int cc ) : T( tc ), ccolor( cc ) { }

void draw( )

T( int tc=0 ) : tcolor( tc ) { }

{

virtual void draw( )

T::draw( );

{

cout << " center:" << ccolor;

cout << " triangle:" << tcolor;

}

}

};

};

struct TBC : TB, TC //triangle with border and center

struct TB : T //triangle with border

{

TBC( int tc, int bc, int cc ) : TB( tc ,bc ), TC( tc, cc ) { }

{

void draw( )

int bcolor;

{

TB( int tc, int bc ) : T( tc ), bcolor( bc ) { }

TB::draw( );

void draw( )

TC::draw( );

{

}

T::draw( );

void info( )

cout << " border:" << bcolor;

{

}

//cout << tcolor; // BLAD! tcolor niejednoznaczne

cout << TB::tcolor;

};

cout << TC::tcolor;

cout << bcolor << ccolor;

}

};

Tomasz Marks - Wydział MiNI PW

-5-

Tomasz Marks - Wydział MiNI PW

-6-

Wielodziedziczenie (3)

Wielodziedziczenie (4)

int main ( )

Hierarchia klas

{

TBC tr( 1, 2, 3 );

tr.info( ); // 1 1 2 3

zrealizowana: oczekiwana:

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.

Komentarz:

Aby usunąć ten kłopot moŜ na zastosować wirtualne dziedziczenie bazy T

Aby usunąć ten kłopot moŜ na zastosować wirtualne dziedziczenie bazy T

(patrz nastę pny przykład).

(patrz nastę pny przykład).

Tomasz Marks - Wydział MiNI PW

-7-

Tomasz Marks - Wydział MiNI PW

-8-

Wielodziedziczenie – baza wirtualna (1)

Wielodziedziczenie – baza wirtualna (2)

struct TC : virtual T //triangle with center

struct T //triangle

{

{

int ccolor;

int tcolor;

TC( int tc, int cc ) : T( tc ), ccolor( cc ) { }

void draw( )

T( int tc=0 ) : tcolor( tc ) { }

{

virtual void draw( )

T::draw( );

{

cout << " center:" << ccolor;

cout << " triangle:" << tcolor;

}

}

};

};

struct TBC : TB, TC //triangle with border and center

struct TB : virtual T //triangle with border

{

TBC( int tc, int bc, int cc ) : T( tc ), TB( tc, bc ), TC( tc, cc ) { }

{

void draw( )

int bcolor;

{

TB( int tc, int bc ) : T( tc ), bcolor( bc ) { }

TB::draw( );

void draw( )

TC::draw( );

{

}

T::draw( );

void info( )

cout << " border:" << bcolor;

{

}

cout << tcolor;

// teraz O.K.

cout << TB::tcolor;

};

cout << TC::tcolor;

cout << bcolor << ccolor;

}

};

Tomasz Marks - Wydział MiNI PW

-9-

Tomasz Marks - Wydział MiNI PW

-10-

Wielodziedziczenie – baza wirtualna (3)

Wielodziedziczenie – baza wirtualna (1a)

int main ( )

struct T //triangle

{

{

TBC tr( 1, 2, 3 );

int tcolor;

T( int tc=0 ) : tcolor( tc ) { }

tr.info( ); // 1 1 1 2 3

void Draw( )

tr.draw( ); // triangle:1 border:2 triangle:1 center:3

{

cout << " triangle:" << tcolor;

tr.tcolor = 4;

// teraz O.K.

}

tr.TB::tcolor = 5;

virtual void draw ( ) { Draw( ); }

tr.TC::tcolor = 6;

};

tr.info( ); // 6 6 6 2 3

tr.draw( ); // triangle:6 border:2 triangle:6 center:3

struct TB : virtual T //triangle with border

}

{

int bcolor;

Komentarz:

TB( int tc, int bc ) : T( tc ), bcolor( bc ) { }

void Draw( ) { cout << " border:" << bcolor; }

Obiekt tr zawiera teraz tylko jeden trójką t ( bę dą cy wirtualnie dziedziczonym void draw( )

podobiektem typu T w składowych typów TB i TC ). W ten sposób nie ma

{

juŜ sprzecznoś ci z intencjami projektowymi.

T::Draw();

Draw( );

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

-11-

Tomasz Marks - Wydział MiNI PW

-12-

Wielodziedziczenie – baza wirtualna (2a)

Wielodziedziczenie – baza wirtualna (3a)

struct TC : virtual T //triangle with center

int main ( )

{

{

int ccolor;

TBC tr( 1, 2, 3 );

TC( int tc, int cc ) : T( tc ), ccolor( cc ) { }

void Draw( ) { cout << " center:" << ccolor; }

tr.draw( ); // triangle:1 border:2 center:3 .....

void draw( )

{

tr.tcolor = 4;

// teraz O.K.

T::Draw();

tr.TB::tcolor = 5;

Draw( );

tr.TC::tcolor = 6;

}

};

tr.draw( ); // triangle:6 border:2 center:3 .....

}

struct TBC : TB, TC //triangle with border and center

{

TBC( int tc, int bc, int cc ) : T( tc ), TB( tc, bc ), TC( tc, cc ) { }

Komentarz:

void Draw( ) { cout << " ....."; }

void draw( )

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 T::Draw( ); TB::Draw(); TC::Draw();

tylko jeden raz, korzystają c ze specyficznych wersji metody Draw Draw( );

okreś lonych w poszczególnych klasach.

}

};

Tomasz Marks - Wydział MiNI PW

-13-

Tomasz Marks - Wydział MiNI PW

-14-

Co to jest Paradygmat ?

•

W Oxford English Dictionary paradygmat jest zdefiniowany jako

wzorzec lub najogólniejszy model lub jako wzorcowy przykład.

paradygmat

•

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.

obiektowy

•

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

-15-

Tomasz Marks - Wydział MiNI PW

-16-

Podstawowe załoŜenia

Abstrakcja

paradygmatu obiektowego

•

Rozpatrujemy pewien system rozumiany jako układ obiektów.

Powszechnie uwaŜa się, Ŝe najwaŜniejsze są następujące cechy:

•

KaŜdy obiekt w systemie moŜna rozpatrywać jako model

• Abstrakcja

abstrakcyjnego elementu, który moŜe:

– opisywać i zmieniać swój stan,

– komunikować się z innymi obiektami w systemie,

• Enkapsulacja (hermetyzacja)

– wykonywać pewne czynności na rzecz innych obiektów,

bez ujawniania, w jaki sposób zaimplementowano dane cechy.

• Polimorfizm

UWAGA: Procesy, funkcje i/lub metody mogą być równieŜ abstrahowane.

W taki przypadku konieczne są róŜne techniki rozszerzania abstrakcji.

• Dziedziczenie

Tomasz Marks - Wydział MiNI PW

-17-

Tomasz Marks - Wydział MiNI PW

-18-

Enkapsulacja (hermetyzacja)

Polimorfizm (1)

•

Polega na ukrywaniu szczegółów implementacji.

•

W krystalografii: Polimorfizm (róŜnopostaciowość) – zjawisko

•

Ma to zapewnić, Ŝe obiekt nie moŜe zmieniać stanu wewnętrznego

występowania róŜnych odmian tej samej substancji. Występuje ono

innych obiektów w nieoczekiwany sposób.

wtedy, gdy ta sama substancja moŜe występować w dwóch lub

nawet kilku formach krystalicznych.

•

Tylko wewnętrzne metody obiektu są uprawnione do zmiany jego stanu.

•

KaŜdy typ obiektu dostarcza innym obiektom swój "interfejs", który

•

W takim sensie moŜna uwaŜać, Ŝe polimorfizm

określa dopuszczalne metody współpracy.

jest opisany stwierdzeniem: " B i C są A" dla

klas B i C dziedziczących z klasy:

UWAGA: Pewne języki programowania (n.p. C++) nie realizują tego

•

W programowaniu rozumie si

zało

ę to na ogół w węŜszym sensie,

Ŝenia zbyt rygorystycznie, dopuszczając pewien poziom

bezpo

patrz nast

średniego dostępu do szczegółów implementacyjnych obiektu.

ępna strona:

Prowadzi to do ograniczenia poziomu abstrakcji.

Tomasz Marks - Wydział MiNI PW

-19-

Tomasz Marks - Wydział MiNI PW

-20-

Polimorfizm (2)

Dziedziczenie

•

Referencje i kolekcje obiektów mogą dotyczyć obiektów róŜnego

•

Dziedziczenie porządkuje i wspomaga polimorfizm i enkapsulację.

typu, a wywołanie metody dla referencji spowoduje zachowanie

odpowiednie dla pełnego typu obiektu wywoływanego.

•

Osiąga to dzięki umoŜliwieniu definiowania i tworzenia specjalizowanych

obiektów na podstawie bardziej ogólnych.

•

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

•

Dla obiektów specjalizowanych nie trzeba redefiniowa

źnik lub referencję.

ć całej

funkcjonalności, lecz tylko tę, której nie mają obiekty ogólniejsze.

•

Typ z funkcjami wirtulnymi nazywa się typem polimorficznym

(B. Stroustrup str. 345)

UWAGA: W typowych przypadkach powstają grupy obiektów zwane

klasami, oraz grupy klas zwane drzewami. Odzwierciedlają one wspólne cechy obiektów.

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

-21-

Tomasz Marks - Wydział MiNI PW

-22-

Koniec wykładu 15.

Tomasz Marks - Wydział MiNI PW

-23-