Kompozycja i dziedziczenie

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

1 / 26




Programowanie obiektowe

Kompozycja i dziedziczenie klas

Paweł Rogali

ń

ski

Instytut Informatyki, Automatyki i Robotyki
Politechniki Wrocławskiej

pawel.rogalinski pwr.wroc.pl

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

2 / 26

Zwi

ą

zki mi

ę

dzy klasami: „jest” i „zawiera”

Przkład:









Pojazd silnikowy

jest szczególnym rodzajem

Pojazdu

Motocykl

jest szczególnym rodzajem

Pojazdu silnikowego

Pojazd silnikowy

zawiera

Silnik

Pojazd

Pojazd

silnikowy

Samochód

Motocykl

Wóz

konny

Rower

Silnik

Silnik

elektryczny

Silnik

spalinowy

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

3 / 26

Ponowne wykorzystanie klas

Przy tworzeniu nowych klas mo

ż

na wykorzystywa

ć

ju

ż

istniej

ą

ce klasy za pomoc

ą

:



kompozycji

,



dziedziczenia

.

Kompozycj

ę

stosuje si

ę

wtedy, gdy mi

ę

dzy klasami zachodzi relacja typu

cało

ść

cz

ęść

” tzn. nowa klasa

zawiera

w sobie istniej

ą

c

ą

klas

ę

.

Dziedziczenie

stosuje

si

ę

wtedy,

gdy

mi

ę

dzy

klasami

zachodzi

relacja

generalizacja

specjalizacja

” tzn. nowa klasa

jest szczególnym

rodzajem

juz istniej

ą

cej klasy.

Uwaga:

Zwykle tworzy si

ę

nowe klasy wykorzystuj

ą

c jednocze

ś

nie kompozycj

ę

i dziedziczenie np.:
klasa Pojazd silnikowy jest uszczegółowieniem klasy Pojazd oraz zawiera w
sobie klas

ę

Silnik.

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

4 / 26

Diagramy klas w j

ę

zyku UML

UML (ang. Unified Modeling Language) – zunifikowany j

ę

zyk modelowania do tworzenia

systemów obiektowo zorientowanych.

Diagram klas

pokazuje klasy i zachodz

ą

ce mi

ę

dzy nimi relacje.




generalizacja

specjalizacja

NowaKlasa

jest

szczególnym

rodzajem KlasyBazowej

cało

ść

cz

ęść

NowaKlasa zawiera n-krotnie
pola KlasySkladowej

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

5 / 26

Kompozycja

Kompozycj

ę

uzyskujemy poprzez definiowanie w nowej klasie pól, które s

ą

obiektami

istniej

ą

cych klas.


Przykład:

Klasa

Osoba

zawiera:



pola

nazwisko

i

imie

, które nale

żą

do klasy

String

.

Klasa

Ksi

ą

zka

zawiera:



pole

autor

nale

żą

ce do klasy

osoba

,



pole

tytul

nale

żą

ce do klasy

String

,



pole

cena

typu

double

.

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

6 / 26

Kompozycja cd.

Definicja klasy

Osoba

class

Osoba

{

private

String nazwisko;

private

String imie;


public

Osoba(String nazwisko, String imie)

{

this

.nazwisko = nazwisko;

this

.imie = imie;

}

public

String podajNazwisko()

{

return

nazwisko;

}

public

String podajImie()

{

return

imie;

}
}

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

7 / 26

Kompozycja cd.

Definicja klasy

Ksiazka

class

Ksiazka

{

private

Osoba autor;

private

String tytul;

double

cena;


public

Ksiazka(Osoba autor, String tytul,

double

cena)

{

this

.autor = autor;

this

.tytul = tytul;

this

.cena = cena;

}

public

Osoba podajAutor()

{

return

autor;

}

public

String podajTytul()

{

return

tytul;

}

public

double podajCena()

{

return

cena;

}
}


background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

8 / 26

Kompozycja cd.

Przykładowa instrukcja tworz

ą

ca nowy obiekt klasy

Ksiazka

:

Ksiazka lektura = new Ksiazka( new Osoba(”Sienkiewicz”, ”Henryk”),
”Potop”,
32.5 );

nazwisko

imie

Osoba

autor

tytul

cena

32.5

Ksiazka

String

”Potop”

String

”Henryk”

String

”Sienkiewicz

lektura

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

9 / 26

Dziedziczenie

Dziedziczenie

polega na przej

ę

ciu wła

ś

ciwo

ś

ci i funkcjonalno

ś

ci obiektów innej klasy

i ewentualnej modyfikacji tych wła

ś

ciwo

ś

ci i funkcjonalno

ś

ci w taki sposób, by były one

bardziej wyspecjalizowane.

Do wyra

ż

ania relacji dziedziczenia jednej klasy przez drug

ą

słu

ż

y słowo kluczowe

extends



class B extends A
{
...
}



Klasa

B

dziedziczy

(rozszerza) klas

ę

A

, tzn.



klasa

A

jest

klas

ą

bazow

ą

, (superklas

ą

) klasy

B



klasa

B

jest

klas

ą

pochodn

ą

klasy

A

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

10 / 26

Dziedziczenie cd.

Przykład:

Klasa

Publikacja

zawiera:



pole

tytul

z klasy

String

i pole

cena

typu

double

.

Klasa

Ksi

ą

zka

dziedziczy po klasie

Publikacja

i dodatkowo zawiera:



pole

autor

nale

żą

ce do klasy

String

.

Klasa

Czasopismo

dziedziczy po klasie

Publikacja

i dodatkowo zawiera:



pole

numer

typu

int

.

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

11 / 26

Dziedziczenie cd.

Definicja klasy bazowej

Publikacja

class

Publikacja

{

private

String tytul;

private

double

cena;


Publikacja(String tytul,

double

cena)

{

this

.tytul = tytul;

this

.cena = cena;

}


public

String podajTytul()

{

return

tytul;

}

public

double podajCene()

{

return

cena;

}
}

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

12 / 26

Dziedziczenie cd.

Definicja klas pochodnych

Ksiazka

i

Czasopismo

,

które dziedzicz

ą

po klasie

Publikacja

class

Ksiazka

extends

Publikacja

{

private

String autor;

Ksiazka(String autor, String tytul,

double

cena)

{

super

(tytul, cena);

// Wywołanie konstruktora klasy bazowej Publikacja

this

.autor = autor;

}

public

String podajAutor()

{

return

autor;

}
}

class

Czasopismo

extends

Publikacja

{

private

int

numer;

Czasopismo(String tytul,

int

numer,

double

cena)

{

super

(tytul, cena);

// Wywołanie konstruktora klasy bazowej Publikacja

this

.numer = numer;

}

public

int

podajNumer()

{

return

numer;

}
}

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

13 / 26

Dziedziczenie cd.

Przykładowe instrukcje tworz

ą

ce nowe obiekty klas

Ksiazka

i

Czasopismo

:

Ksiazka lektura = new Ksiazka(”Bolesław Prus”, ”Lalka”, 22.50 );

Czasopismo gazeta = new Czasopismo(”Przektój”, 12, 3.90 );

tytul

cena

22.50

autor

Publikacja(...)

podajTytul()

podajCena()

Ksiazka(...)

podajAutor()

Ksiazka

String

”Lalka”

String

”Bolesław Prus

lektura

tytul

cena

3.90

numer

12

Publikacja(...)

podajTytul()

podajCena()

Czasopismo(...)

podajNumer()

Czasopismo

String

”Przekrój”

gazeta

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

14 / 26

Inicjowanie obiektów przy dziedziczeniu

Pola klasy bazowej mo

ż

na inicjowa

ć

za pomoc

ą

wywołania z konstruktora klasy

pochodnej konstruktora klasy bazowej:

super(args);

gdzie

args

jest list

ą

argumentów przekazanych do konstruktora klasy bazowej

Je

ś

li konstrukcja

super(...)

wyst

ę

puje, MUSI by

ć

pierwsz

ą

instrukcj

ą

konstruktora klasy pochodnej.

Gdy nie wyst

ę

puje, przed wykonaniem kodu klasy pochodnej zostanie

wywołany konstruktor bezparametrowy klasy bazowej.


Przykład:

Czasopismo(String tytul, int numer, double cena)
{ super(tytul, cena);
this.numer = numer;
}

Wywołanie konstruktora

klasy bazowej

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

15 / 26

Inicjowanie obiektów przy dziedziczeniu cd.

Przy

tworzeniu

obiektów

klas

pochodnych

podstawow

ą

reguł

ą

jest,

ż

e

najpierw musz

ą

by

ć

zainicjowane pola odziedziczone z klasy bazowej,

potem dodatkowe pola deklarowane w klasie pochodnej.

Sekwencja inicjowania obiektu klasy pochodnej jest nast

ę

puj

ą

ca:

1. Wywoływany jest konstruktor klasy pochodnej,

2. Je

ś

li pierwsz

ą

instrukcj

ą

jest

super(args)

, wykonywany jest konstruktor

klasy bazowej z argumentami

args

.

3. Je

ś

li nie ma

super(args)

, wykonywany jest konstruktor bezparametrowy

klasy bazowej.

4. Wykonywane s

ą

instrukcje wywoływanego konstruktora klasy pochodnej.

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

16 / 26

Inicjowanie obiektów przy dziedziczeniu cd.

class

A

{
A()
{ System.out.println(

" Konstruktor bezparametrowy klasy A"

);

}

A(String t)
{ System.out.println(

" Konstruktor klasy A z parametrem String "

+ t);

}
}

class

B

extends

A

{
B()
{ System.out.println(

" Konstruktor bezparametrowy klasy B"

);

}

B(

int

i)

{ System.out.println(

" Konstruktor klasy B z parametrem int "

+ i);

}

B(String t)
{

super

(t);

System.out.println(

" Konstruktor klasy B z parametrem String "

+ t);

}
}

class

C

extends

B

{
}

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

17 / 26

Inicjowanie obiektów przy dziedziczeniu cd.

class

KlasyABC

{

public

static

void

main(String [] args)

{
System.out.println(

"Tworzenie obiektu B -> new B();"

);

new

B();

System.out.println(

"\nTworzenie obiektu B -> new B(int);"

);

new

B(1);

System.out.println(

"\nTworzenie obiektu B -> new B(String);"

);

new

B("Ala");

System.out.println(

"\nTworzenie obiektu C -> new C();"

);

new

C();

}
}

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

18 / 26

Przeci

ąż

anie metod

Przeci

ąż

anie metod

w klasie polega na definiowaniu wielu metod o tej samej nazwie

ale odmiennej li

ś

cie parametrów. Przeci

ąż

ane mog

ą

by

ć

zarówno konstruktory jak i

metody statyczne i niestatyczne.

Przykład:

class

Para

{

int

a, b;

Para()
{ System.out.println(

" Konstruktor bezparametrowy"

);

a = b = 0;
}

Para(

int

x,

int

y)

{ System.out.println(

" Konstruktor z parametrami"

);

a = x; b = y;
}

void

pokaz()

{ System.out.println(

"Metoda bez parametru"

);

System.out.println(

"Para("

+ a +

", "

+ b +

")"

);

}

void

pokaz(String tekst)

{ System.out.println(

"Metoda z parametrem"

);

System.out.print(tekst);
pokaz();
}

Przeci

ąż

one

konstruktory

Przeci

ąż

one

konstruktory

Przeci

ąż

one

konstruktory

Przeci

ąż

one

metody

Wywołanie metody

przeci

ąż

onej

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

19 / 26

Przeci

ąż

anie metod cd.


public

static

void

main(String[] args)

{
System.out.println(

"<=== Tworzenie obiektow ===>"

);

Para p1 =

new

Para();

Para p2 =

new

Para(3,7);



System.out.println(

"\n<=== Metoda pokaz bez parametru ===>"

);

p2.pokaz();

System.out.println(

"\n<=== Metoda pokaz z parametrem ===>"

);

p2.pokaz(

"Para p2: "

);


}
}

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

20 / 26

Przedefiniowanie metody

Przedefiniowanie metody

klasy bazowej w klasie pochodnej nast

ę

puje wtedy, gdy w

klasie pochodnej zdefiniujemy metod

ę

z tak

ą

sam

ą

sygnatur

ą

(nazwa i lista parametrów)

i typem wyniku jak sygnatura i typ wyniku nieprywatnej i niestatycznej metody klasy

bazowej.


Wówczas metoda klasy bazowej zostaje ukryta.

Przykład:

class

Para

{

int

a, b;


Para(

int

x,

int

y)

{ System.out.println(

" Konstruktor z parametrami"

);

a = x; b = y;
}

void

pokaz()

{ System.out.println(

"Metoda bez parametru z klasy Para"

);

System.out.println(

"Para("

+ a +

", "

+ b +

")"

);

}

}

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

21 / 26

Przedefiniowanie metody cd.

class

Trojka extends Para

{

int

c;

Trojka(

int

x,

int

y,

int

z)

{

super

(x, y);

c = z;
}

void

pokaz()

{ System.out.println(

"Metoda bez parametru z klasy Trojka"

);

System.out.println(

"Trojka("

+ a +

", "

+ b +

", "

+ c +

")"

);

}

void

pokaz(String tekst)

{ System.out.println(

"Metoda z parametrem z klasy Trojka"

);

System.out.println(tekst);
pokaz();

super

.pokaz();

}

public

static

void

main(String[] args)

{
System.out.println(

"<=== Tworzenie obiektow ===>"

);

Trojka t1 =

new

Trojka(1, 2, 3);

System.out.println(

"\n<=== Metoda pokaz bez parametru ===>"

);

t1.pokaz();

System.out.println(

"\n<=== Metoda pokaz z parametrem ===>"

);

t1.pokaz(

"Trojka t1: "

);

}
}

Wywołanie konstruktora

klasy bazowej

Przedefiniowanie

metody z klasy bazowej

Przeci

ąż

enie metody

Wywołanie metody

przedefiniowanej

Wywołanie metody z

klasy bazowej

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

22 / 26

Przedefiniowanie metody cd.

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

23 / 26

Pokrycie metody statycznej

Pokrycie metody statycznej

klasy bazowej w klasie pochodnej nast

ę

puje wtedy, gdy w

klasie pochodnej zdefiniujemy statyczn

ą

metod

ę

z tak

ą

sam

ą

sygnatur

ą

(nazwa i lista

parametrów) i typem wyniku jak sygnatura i typ wyniku nieprywatnej i statycznej metody

klasy bazowej.


Wówczas metoda klasy bazowej zostaje ukryta. Mo

ż

na si

ę

do niej odwoła

ć

z innej

metody poprzedzaj

ą

c wywołanie metody nazw

ą

klasy bazowej i operatorem „

.”

.


Uwaga:

W podobny sposób mo

ż

na pokrywa

ć

pola klasy bazowej. Nale

ż

y w klasie

pochodnej zdefiniowa

ć

pole o tej samej nazwie (mo

ż

e by

ć

innego typu).

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

24 / 26

Pokrycie metody statycznej cd.

class

KlasaBazowa

{

static

void

drukuj()

{ System.out.println(

"Metoda statyczna klasy bazowej"

);

}
}

class

KlasaPochodna

extends

KlasaBazowa

{

static

void

drukuj()

{ System.out.println(

"Metoda statyczna klasy pochodnej"

);

}

public

static

void

main(String[] args)

{
drukuj();

KlasaBazowa.drukuj();
}
}



Pokrycie metody statycznej

z klasy bazowej

Wywołanie metody statycznej

z klasy pochodnej

Wywołanie metody statycznej

z klasy bazowej

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

25 / 26

Przedefiniowanie i pokrycie - podsumowanie



Metody prywatne nie mog

ą

by

ć

przedefiniowane ani pokryte, gdy

ż

nie s

ą

dost

ę

pne

w klasie pochodnej.



Metoda nieprywatna i niestatyczna jest przedefiniowana w klasie pochodnej,

je

ś

li ma tak

ą

sam

ą

sygnatur

ę

jak metoda klasy bazowej.



Typ wyniku metody przedefiniowuj

ą

cej w klasie pochodnej musi by

ć

taki sam jak

typ wyniku metody przedefiniowanej z klasy bazowej.



Przy przedefiniowaniu mo

ż

na za pomoc

ą

specyfikatorów dost

ę

pu rozszerza

ć

dost

ę

p,

ale nie mo

ż

na go zaw

ęż

a

ć

.



Metody statyczne nie mog

ą

by

ć

przedefiniowane ale mog

ą

by

ć

pokryte.



Przy przedefiniowaniu i pokryciu metod trzeba zachowa

ć

zgodno

ść

typów wyj

ą

tków

zgłaszanych przez metod

ę

i deklarowanych w klauzuli

throws

.

background image

Kompozycja i dziedziczenie klas Autor: Paweł Rogali

ń

ski – Instytut Informatyki, Automatyki i Robotyki PWr

26 / 26

Hierarchia dziedziczenia w Javie

Je

ś

li przy definicji klasy nie u

ż

ywamy słowa

extends

(tzn. nie

żą

damy jawnie

dziedziczenia) to nasza klasa domy

ś

lnie dziedziczy klas

ę

Object

.


W Javie ka

ż

da klasa mo

ż

e bezpo

ś

rednio odziedziczy

ć

tylko jedn

ą

klas

ę

. Ale po

ś

rednio

mo

ż

e mie

ć

dowolnie wiele nadklas.

W Javie wszystkie klasy pochodz

ą

po

ś

rednio od klasy

Object

class

A

{
}

class

B

extends

A

{
}

cl

a

ss C

extends

A

{
}

class

D extends B

{
}

class

E

extends

E

{
}


Wyszukiwarka

Podobne podstrony:
wyklad5 dziedziczenie kompozycja polimorfizm
wyklad5 dziedziczenie kompozycja polimorfizm
Dziedziczenie a kompozycja
wyklad5 dziedziczenie kompozycja polimorfizm
Rodowody, dziedziczenie, imprinting
dziedziczenie chorob jednogenowych
dziedziny wychowania(1)
Kolonialne dziedzictwo
16 Dziedziczenie przeciwtestamentowe i obliczanie zachowkuid 16754 ppt
Ocena wpływu składników spoiwa polimerowo cementowego na właściwości kompozytu
kompozytorklasowek gwo pl application pdfQuestions y=1339356508
078c rozp zm rozp min gosp w spr szkolenia w dziedzinie bhp
Decyzja Rady 90 424 EWG z dnia 26 czerwca 1990 r w sprawie wydatków w dziedzinie weterynarii
MK warstwowe.odpowiedzi, STUDIA, SEMESTR IV, Materiały kompozytowe

więcej podobnych podstron