background image

Tomasz Marks  - Wydział MiNI PW

-1-

Programowanie Obiektowe

(j

ę

zyk C++)

Wykład 15.

Tomasz Marks  - Wydział MiNI PW

-2-

hierarchie klas

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

Ŝ

szym rysunku:

background image

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 TC ), które mog

ą

mie

ć

Ŝ

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:

background image

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 w składowych typów TB 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( );

}

};

background image

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 ?

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.

background image

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

ą

Ŝ

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:

background image

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.