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