Dedičnosť
Sedemnásta prednáška
Stiahnuť PDF · 4,7 MBPreber si túto poznámku so svojou AI
Skopíruj pripravený podklad a vlož ho do ChatGPT, Claude alebo inej AI — bude ťa učiť alebo skúšať len z tejto poznámky.
Náhľad poznámky
Dedičnosť
Informatika 2
Pojmy zavedené v 5. prednáške(1)
• interface
– implementácia viacerých interface v triedach
• implements interface1, interface2, ...
– rozšírenie jedného interface v inom interface
• extends interface1, interface2, ...
• interface v štandardnej knižnici Java
Informatika 2
1
Pojmy zavedené v 5. prednáške(2)
• operátor instanceof
• pretypovanie
– implicitné
– explicitné
– bezpečné explicitné pretypovanie
Informatika 2
2
Pojmy zavedené v 5. prednáške(3)
• menný priestor
• balíčky
– nepomenovaný balíček
– príkaz package
– konvencie Java
– javadoc – package-info.java
– UML
Informatika 2
3
Cieľ prednášky
• základy dedičnosti
• príklad: KCaIB
Informatika 2
4
„KCaIB“ – úloha 1
• jednoduchý katalóg CD
– pridávanie CD
– výpis zoznamu CD
– užívateľské komentáre
• informácie o CD
– titul CD (názov albumu)
– autor (spevák, skupina)
– počet skladieb na CD
– celkový čas v minútach
– užívateľov komentár
Informatika 2
5
Riešenie
• dve triedy
– Katalog
– CD
• ukladanie zoznamu CD do kontajnera ArrayList
• CD
– vie vrátiť informácie o sebe
– vie pridať riadok poznámky
– vie sa vypísať na terminál
Informatika 2
6
Prvá verzia KCaIB – vonkajší pohľad
Informatika 2
7
Prvá verzia KCaIB – vnútorný pohľad
Informatika 2
8
„KCaIB“ – úloha 2(1)
• jednoduchý katalóg audiovizuálnych diel
– pridávanie diela
• výpis zoznamu diela
• užívateľské komentáre
• informácie o CD
• informácie o DVD
Informatika 2
9
„KCaIB“ – úloha 2(2)
• informácie o CD
– titul CD (názov albumu)
– autor (spevák, skupina)
– počet skladieb na CD
– celkový čas v minútach
– používateľov komentár
Informatika 2
10
„KCaIB“ – úloha 2(3)
• informácie o DVD
– titul DVD (názov filmu)
– režisér
– celkový čas v minutách
– používateľov komentár
Informatika 2
11
Ako na to
• trieda pre DVD
• trieda pre CD
• polymorfizmus
• interface so spoločnými správami
– dajTitul
– dajCelkovyCas
– pridajKomentar
– dajKomentar
– vypis
Informatika 2
12
Zavedenie interface(1)
Informatika 2
13
Zavedenie interface(2)
Informatika 2
14
Trieda CD – definícia
public class CD implements IAudiovizualneDielo
{
private String aTitul;
private String aAutor;
private int aPocetSkladieb;
private int aCelkovyCas;
private String aKomentar;
...
}
Informatika 2
15
Trieda DVD – definícia
public class DVD implements IAudiovizualneDielo
{
private String aTitul;
private String aReziser;
private int aCelkovyCas;
private String aKomentar;
...
}
Informatika 2
16
Trieda CD – konštruktor
public CD(String paTitul, String paAutor,
int paPocetSkladieb, int paCelkovyCas)
{
aTitul = paTitul;
aAutor = paAutor;
aPocetSkladieb = paPocetSkladieb;
aCelkovyCas = paCelkovyCas;
aKomentar = null;
}
Informatika 2
17
Trieda DVD – konštruktor
public DVD(String paTitul, String paReziser,
int paCelkovyCas)
{
aTitul = paTitul;
aReziser = paReziser;
aCelkovyCas = paCelkovyCas;
aKomentar = null;
}
Informatika 2
18
Trieda CD – prístupové metódy(1)
public String dajTitul()
{
return aTitul;
}
public String dajAutora()
{
return aAutor;
}
Informatika 2
19
Trieda CD – prístupové metódy(2)
public int dajPocetSkladieb()
{
return aPocetSkladieb;
}
public int dajCelkovyCas()
{
return aCelkovyCas;
}
Informatika 2
20
Trieda DVD – prístupové metódy
public String dajTitul()
{
return aTitul;
}
public String dajRezisera()
{
return aReziser;
}
public int dajCelkovyCas()
{
return aCelkovyCas;
}
Informatika 2
21
Trieda CD – práca s komentármi
public String dajKomentar()
{
return aKomentar;
}
public void pridajKomentar(String paKomentar)
{
if (aKomentar == null) {
aKomentar = paKomentar;
} else {
aKomentar = aKomentar + "\n" + paKomentar;
}
}
Informatika 2
22
Trieda DVD – práca s komentármi
public String dajKomentar()
{
return aKomentar;
}
public void pridajKomentar(String paKomentar)
{
if (aKomentar == null) {
aKomentar = paKomentar;
} else {
aKomentar = aKomentar + "\n" + paKomentar;
}
}
Informatika 2
23
Trieda CD – výpis
public void vypis()
{
System.out.println("CD:");
System.out.println("- Skladieb: " + aPocetSkladieb);
System.out.println("- Autor: " + aAutor);
System.out.println("- Titul: " + aTitul);
System.out.println("- Cas: " + aCelkovyCas);
if (aKomentar != null) {
System.out.println("Komentar ku CD:");
System.out.println(aKomentar);
}
}
Informatika 2
24
Trieda DVD – výpis
public void vypis()
{
System.out.println("DVD:");
System.out.println("- Reziser: " + aReziser);
System.out.println("- Titul: " + aTitul);
System.out.println("- Cas " + aCelkovyCas);
if (aKomentar != null) {
System.out.println("Komentar ku DVD:");
System.out.println(aKomentar);
}
}
Informatika 2
25
Duplicita kódu
• triedy CD a DVD zdieľajú veľkú časť kódu
• duplicita kódu
– sťažuje údržbu kódu
– potencionálne miesto pre vznik chýb
• riešenie
– samostatná trieda so spoločnými časťami, kompozícia
Informatika 2
26
Riešenie pomocou kompozície(1)
Informatika 2
27
Riešenie pomocou kompozície(2)
• CD aj DVD si ako atribút v konštruktore vytvorí
inštanciu AudiovizualneInfo
• vykonávaním spoločnej funkcionality poveria túto
inštanciu
• iné riešenie: dedičnosť
Informatika 2
28
public void pridajKomentar(String paKomentar)
{
aInfo.pridajKomentar(paKomentar);
}
Riešenie pomocou dedičnosti
Informatika 2
29
dedičnosť
Dedičnosť
• vzťah medzi triedami
• trieda ako typ objektu
• hierarchia dedičnosti – vyjadruje typológiu
objektov
– delenie objektov na typy a podtypy
– ľubovoľná úroveň
Informatika 2
30
Dedičnosť v reálnom svete(1)
• vozidlo
– bicykel
• Kelly’s
• Author
– auto
• Škoda
• Mercedes
• Ferrari
• Peugeot
Informatika 2
31
Dedičnosť v reálnom svete(2)
Informatika 2
32
Dedičnosť v reálnom svete(3)
Informatika 2
33
Základné pojmy(1)
• potomok – podtyp – odvodená trieda
– trieda Auto je potomok triedy Vozidlo
– trieda Author je potomok triedy Vozidlo
• predok – nadtyp – základná trieda
– trieda Bicykel je predok triedy Author
– trieda Vozidlo je predok triedy Author
Informatika 2
34
Základné pojmy(2)
• priamy potomok
– trieda Auto je priamy potomok triedy Vozidlo
• priamy predok
– trieda Bicykel je priamy predok triedy Author
• absolútny predok – „koreň” stromu hierarchie
– trieda Vozidlo
Informatika 2
35
Potomok dedí od predka
• vonkajší pohľad
– verejné rozhranie
• vnútorný pohľad
– atribúty
– metódy
• potomok nemá priamy prístup k neverejným
zložkám predka – interné ukrývanie informácií
Informatika 2
36
37
Informatika 2
Vonkajší a vnútorný pohľad
aAutor
aPocSkladieb
aTitul
aKomentar
aCelkovyCas
pridajKomentar()
CD
38
Informatika 2
Vonkajší a vnútorný pohľad
aAutor
aPocSkladieb
aTitul
aKomentar
aCelkovyCas
pridajKomentar()
CD AVIDielo
Dedičnosť v jazyku Java(1)
• alebo
• v odvodenej triede
• len jeden predok
Informatika 2
39
public class CD extends AudiovizualneDielo
public class CD extends AudiovizualneDielo
implements IAudiovizualneDielo
Dedičnosť v jazyku Java(2)
• ! Potomok nededí konštruktory predka
• konštruktory treba znovu definovať
– prvý príkaz v tele konštruktora – kľúčové slovo super
Informatika 2
40
Dedičnosť v jazyku Java(2)
• kľúčové slovo super
– použije konštruktor predka
– inicializácia začiatočného stavu predka
• zoznamParametrov – zoznam skutočných
parametrov, ktoré dostane konštruktor predka
Informatika 2
41
super(zoznamParametrov);
KCaIB – Trieda AudiovizualneDielo
• spoločný predok CD, DVD
• atribúty
– aTitul
– aCelkovyCas
– aKomentar
• metódy
– dajTitul
– dajCelkovyCas
– dajKomentar
– pridajKomentar
Informatika 2
42
KCaIB – Trieda CD
• potomok triedy AudiovizualneDielo
• atribúty
– aAutor
– aPocetSkladieb
• metódy
– dajAutora
– dajPocetSkladieb
– vypis
Informatika 2
43
KCaIB – Trieda DVD
• potomok triedy AudiovizualneDielo
• atribúty
– aReziser
• metódy
– dajRezisera
– vypis
Informatika 2
44
KCaIB v UML(1)
Informatika 2
45
KCaIB v UML(2)
Informatika 2
46
Trieda AudiovizualneDielo
public class AudiovizualneDielo
{
private String aTitul;
private int aCelkovyCas; // v minutach
private String aKomentar;
...
}
Informatika 2
47
Trieda AudiovizualneDielo – konštruktor
public AudiovizualneDielo(String paTitul,
int paCelkovyCas)
{
aTitul = paTitul;
aCelkovyCas = paCelkovyCas;
aKomentar = null;
}
Informatika 2
48
Trieda DVD
public class DVD extends AudiovizualneDielo
implements IAudiovizualneDielo
{
private String aReziser;
...
}
Informatika 2
49
Trieda DVD – konštruktor
public DVD(String paTitul, String paReziser,
int paCelkovyCas)
{
super(paTitul, paCelkovyCas);
aReziser = paReziser;
}
Informatika 2
50
Rozhranie v nástroji BlueJ
Informatika 2
51
KCaIB – tri rôzne spôsoby riešenie
• nezávislé triedy
• skladanie – časť a celok
• dedičnosť
Informatika 2
52
53
Informatika 2
CD: nezávislá trieda – monolit
aAutor
aPocSkladieb
aTitul
aKomentar
aCelkovyCas
pridajKomentar()
CD
54
Informatika 2
CD: závislé triedy – skladanie(1)
aAutor
aPocSkladieb
pridajKomentar()
CD
aInfo
55
Informatika 2
CD: závislé triedy – skladanie(2)
CD
AudiovizualneDielo
aTitul
aKomentar
aCelkovyCas
56
Informatika 2
CD: závislé triedy – dedičnosť
aAutor
aPocSkladieb
aTitul
aKomentar
aCelkovyCas
pridajKomentar()
CD AVIDielo
Znovapoužiteľnosť (reuse)
• nezávislé triedy
– znovapoužiteľnosť na úrovni inštancií tried
– každá trieda implementuje všetky svoje metódy
• skladanie
– znovapoužiteľnosť na úrovni implementácie častí
– objektové atribúty nevyžadujú implementáciu svojich
metód,
• rozhranie definujem kompletne celé
– dedičnosť
– znovapoužiteľnosť na úrovni rozhrania aj implementácie
– zdedené je aj rozhranie
Informatika 2
57
Implementačná závislosť
• nezávislé triedy – žiadna závislosť
– ale nevedia spolupracovať
• skladanie – celok závisí od častí
– závislosť je neverejná
– implementácia je skrytá – dá sa meniť
• dedenie – potomok závisí od predkov
– informácia o predkovi je verejná
Informatika 2
58
Graf hierarchie dedičnosti
• digraf: orientovaný, acyklický, len jednoduché
hrany
• vrcholy: triedy
• hrany: vzťah dedičnosti
• orientácia hrán:
– priamy potomok → priamy predok
Informatika 2
59
Príklad grafu hierarchie dedičnosti
Informatika 2
60
Jednoduchá dedičnosť
• práve jeden predok
– jediná hierarchia – strom
– spoločný preddefinovaný koreň – absolútny predok
– koreň – implicitný predok
– Java – trieda Object
– Delphi Pascal – trieda TObject
Informatika 2
61
62
Informatika 2
Strom dedičnosti – Java
Object
Vozidlo
Hra
AVIDielo
Bicykel
Auto
Škoda
Ferrari
Peugeot
Mercedes
DVD
CD
Jednoduchá dedičnosť
• najviac jeden predok
– ľubovoľný počet nezávislých hierarchií
– každá hierarchia – jeden strom
– spoločne vytvárajú les
– koreň hierarchie
• trieda bez predka, od nikoho nededí
• absolútny predok
– Turbo Pascal
Informatika 2
63
64
Informatika 2
Les dedičnosti – Turbo Pascal
Vozidlo
Hra
AVIDielo
Bicykel
Auto
Škoda
Ferrari
Peugeot
Mercedes
DVD
CD
Viacnásobná dedičnosti
• trieda môže mať ľubovoľný počet predkov
• hierarchia závislých tried – mriežka
– orientované hrany – vzťah dedičnosti
– neorientovane hrany – vzťah závislosti
– graf dedičnosti → graf závislosti
– graf závislosti – súvislý graf
• množina mriežok
• C++, Python, ...
Informatika 2
65
66
Informatika 2
Mriežky dedičnosti – C++
Osoba
Doktorand
Student
Ucitel
Dom
Lod
Hausbot
Dedenie implementácie interface
• trieda AudiovizualneDielo implementuje
interface IAudiovizualneDielo
• triedy CD a DVD dedia po triede
AudiovizualneDielo
=>
• triedy CD a DVD implementujú interface
IAudiovizualneDielo
– je zachovaná typová kompatibilita CD a DVD s
IAudiovizualneDielo
Informatika 2
67
KCaIB – pôvodná verzia
Informatika 2
68
KCaIB – nová verzia(1)
Informatika 2
69
KCaIB – nová verzia(2)
Informatika 2
70
Problém nového riešenia
• AudiovizualneDielo implementuje kompletný
interface IAudiovizualneDielo
– metóda vypis
• AudiovizualneDielo nepozná režiséra DVD, autora
CD a počet skladieb CD
– nedokáže vypísať – nekompletný výpis
Informatika 2
71
Dedičnosť a typová kompatibilita
• vzťah predok – potomok:
– každý potomok (nielen priamy) je typovo
kompatibilný s každým svojim predkom
• typová kompatibilita => implicitné pretypovanie
• žiadny predok nie je kompatibilný so žiadnym
svojim potomkom
– explicitné pretypovanie
– instanceof – bezpečné explicitné pretypovanie
Informatika 2
72
Dedičnosť a polymorfizmus
• polymorfizmus – rôzne chovanie
– určuje rozhranie
– zhoda v rozhraní – rozdiel v implementácii
• dedičnosť – hierarchia a štruktúra tried
– určuje vnútorná štruktúra tried
• typová kompatibilita => polymorfizmus
– typ určitého predka – statický (definovaný) typ
– typ nejakého potomka – dynamický (skutočný) typ
– predok aj potomok majú v rozhraní rovnakú správu
– predok aj potomok definuje vlastnú metódu
Informatika 2
73
Metódy a polymorfizmus(1)
• metódy potomka:
– zdedené – potomok využíva bez zmeny
– vlastné – nové metódy, ktoré predok nemá
– predefinované (prekryté) – predok aj potomok má
svoju vlastnú implementáciu – realizujú
polymorfizmus
– POZOR – preťažené metódy potomka = vlastné
Informatika 2
74
Metódy a polymorfizmus(2)
• preťaženie – dve rôzne správy aj metódy
– aj v jednej triede, aj v rôznych triedach
• prekrytie – jedna správa a dve rôzne metódy
– vždy v rôznych triedach
Informatika 2
75
Polymorfizmus pomocou dedičnosti(1)
Informatika 2
76
Polymorfizmus pomocou dedičnosti(2)
AudiovizualneDielo d;
d = new CD("The Best Of", "Beatles", 12, 75);
// co vypise?
d.vypis();
Informatika 2
77
78
Informatika 2
Poslanie správy, prekladač
AudiovizualneDielo d;
d = new CD(...);
d.vypis();
79
Informatika 2
Poslanie správy, vykonanie(1)
AudiovizualneDielo d;
d = new CD(...);
d.vypis();
80
Informatika 2
Poslanie správy, vykonanie(2)
AudiovizualneDielo d;
d = new CD(...);
d.vypis();
???
81
Informatika 2
Metóda vypis - AudiovizualneDielo
aTitul
aKomentar
aCelkovyCas
pridajKomentar()
AVIDielo
82
Informatika 2
Metódy vypis - CD
aAutor
aPocSkladieb
aTitul
aKomentar
aCelkovyCas
CD AVIDielo
predok
potomok
83
Informatika 2
KCaIB: polymorfizmus
CD
AVIDielo
dajTitul()
dajCas()
dajKomentar()
pridajKomentar()
vypis()
dajAutora()
dajPocSkl()
vypis()
cd:CD
this.vypis()
super.vypis()
Java – prekrytie metód
• super – explicitné použitie metód predka
• nutnosť pre prekryté metódy
• super potláča dynamický typ objektu
• super vnúti objektu typ predka
Informatika 2
84
super.vypis();
Metóda vypis() – AudiovizualneDielo
public void vypis()
{
System.out.print(aTitul);
System.out.println(" (" + aCas + " min.)");
if (aKomentar != null) {
System.out.println(aKomentar);
}
}
Informatika 2
85
Metóda vypis() – DVD
public void vypis()
{
System.out.println("DVD");
System.out.printl("réžia: " + aReziser);
super.vypis();
}
Informatika 2
86
Polymorfizmus a jazyky
• všetky metódy môžu realizovať polymorfizmus
– Java
– Python
• len explicitne označené metódy realizujú
polymorfizmus
– Delphi, C++
– označenie – virtual
Informatika 2
87
Vďaka za pozornosť
Informatika 2
89
text
Automaticky vygenerovaný textový náhľad. Pre plné formátovanie si stiahnite súbor.
nechodím na prednášky