Dedičnosť II
Osemnásta prednáška
Stiahnuť PDF · 669 kBPreber 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
Fakulta riadenia a informatiky ŽU
Dedičnosť II
1
Pojmy zavedené v 6. prednáške(1)
odstránenie duplicít medzi triedami
skladanie
– kompozícia
dedičnosť
dedičnosť
typológia
trieda dedí
vonkajší pohľad
vnútorný pohľad
nededí konštruktory
2
Pojmy zavedené v 6. prednáške(2)
interné ukrývanie informácií
vzťahy pri dedičnosti
predok
potomok
priamy predok
priamy potomok
absolútny predok
3
Pojmy zavedené v 6. prednáške(3)
typy dedičnosti
graf dedičnosti
jednoduchá - strom dedičnosti
jednoducha -
les dedičnosti
viacnásobná - mriežky dedičnosti
4
Pojmy zavedené v 6. prednáške(4)
porovnanie skladania a dedičnosti
znovupoužiteľnosť
implementačná závislosť
dedičnosť a interface
5
Pojmy zavedené v 6. prednáške(5)
dedičnosť a typová kompatibilita
dedičnosť a polymorfizmus
prekrývanie metód
kľučové slovo super
jazyky -
implemetácia polymorfizmu
6
Cieľ
abstraktná trieda
vzťahy is-a, has-a
extenzia triedy
Liskovej princíp substitúcie
trieda Object
projekt: KCaIB
7
Abstraktné triedy v reálnom svete(1)
8
Abstraktné triedy v reálnom svete(2)
Trieda Vozidlo
definované chovanie (pohyb dopredu, odviesť
človeka...)
nevieme si predstaviť jej inštanciu – vybavíme si
konkrétne auto, alebo bicykel
predstavuje abstraktnú triedu
9
Projekt DCaIB(1)
10
Projekt DCaIB(2)
11
Abstraktná trieda i motivácia
inštancie vytvorené triedou AudiovizualneDielo
nemajú význam
v skutočnosti neexistujú
vytvárať možno
trieda AudiovizualneDielo
prvotne odstránenie duplicity v triedach
predok pre rôzne typy avi diel
koreň hierarchie typov (domény)
12
Konkrétna trieda
Inštancie vytvorené triedami CD a DVD
majú význam
existujú aj v skutočnosti
Konkrétna trieda
bežne vytvára inštancie
13
Abstraktná trieda – vlastnosť
charakteristická vlastnosť – nevytvára inštancie
dobrovoľná – možno vytvoriť, nemá význam
povinná – nemožno vytvoriť, zákaz
14
Abstraktná trieda – modelovanie
BlueJ
stereotyp <<abstract>>
nad menom triedy
UML
meno triedy
– kurzíva
15
Abstraktná trieda – BlueJ
16
Abstraktná trieda – UML
17
Abstraktná trieda – Java
kľúčové slovo abstract
hlavička triedy
public abstract class AudiovizualneDielo
{
// telo triedy
}
18
DCaIB
– metódy vypis(1)
AVIDielo
– definícia metódy
CD, DVD
– prekrytie metódy
polymorfizmus
konečná podoba metódy – potomok
19
DCaIB
– metódy vypis(2)
AVIDielo
– metóda nemá konečnú podobu
CD, DVD
– doplnenie informácie
môže vyžadovať iné usporiadanie informácií
iné možnosti návrhu metódy v AVIDielo
prázdne telo metódy
abstraktná metóda
20
Abstraktná a konkrétna metóda
metódy v abstraktnej triede
konkrétne
definícia tela metódy v tele triedy
definícia správy v rozhraní triedy
abstraktné
definícia správy v rozhraní triedy
metódy v konkrétnej triede
len konkrétne
21
Abstraktná a konkrétna metóda – príklad
konkrétna metóda
bicykel ide dopredu po potiahnutí pedálmi – bez
ohľadu na konkrétny typ
abstraktná metóda
bicykel vie zabrzdiť – konkrétna implementácia
(čeľusťové brzdy, V-brzdy, kotúčové brzdy,
hydraulické brzdy...) závisí na konkrétnom type
22
Abstraktná metóda – UML
meno metódy kurzívou
23
Abstraktná metóda – Java
jazyková konštrukcia
zabezpečuje správu do rozhrania
nemá žiadne telo
kľúčové slovo abstract v hlavičke metódy
hlavička ukončená bodkočiarou
public abstract void vypis();
24
Abstraktná metóda – Java
abstraktná metóda – trieda musí byť abstraktná
abstraktná trieda
nechceme vytvárať inštancie – voliteľná
definuje abstraktnú metódu
dedí abstraktnú metódu
25
AVIDielo
– metóda vypis
public abstract class AudiovizualneDielo
{
...
public abstract void vypis();
...
}
26
Implementácia abstraktnej metódy
ako bežná metóda
nemá zmysel prekrývanie abstraktnej metódy
neexistujúca metóda sa nedá prekryť
=>
nepoužíva kľúčové slovo super
super.abstraktnaMetoda()
– syntaktická chyba
27
CD
– metóda vypis
public class CD
{
...
public void vypis()
{
//
príkazy tela metódy
}
...
}
28
CD
– telo metódy vypis
System.out.println("CD:");
System.out.println(" Autor: " + aAutor);
System.out.println(" Titul: " + this.dajTitul());
System.out.println();
System.out.println(" Pocet skladieb: " +
aPocetSkladieb +
" (celkovo " +
this.dajCelkovyCas() + " minut)");
this.vypisKomentar();
29
Vzťah is-a
is-a
– „is a“ – anglicky „je“
dedičnosť je realizáciou vzťahu is-a
každé CD „je“ audiovizuálne dielo
=>
každá inštancia CD je inštanciou
AudiovizualneDielo
30
Dedičnosť a extenzia triedy(1)
extenzia triedy
množina všetkých inštancií
vzťah „is-a“ => aj inštancií potomkov
dôsledok
abstraktné triedy môžu mať neprázdnu extenziu
31
Dedičnosť a extenzia triedy(2)
podľa filozofie už z čias Aristotela
trieda má triádu: meno, intenziu a extenziu
meno
– označenie triedy, napr. Ryba
intenzia
– čo to je ryba, aké ma ryba chovanie
(implementácia triedy Ryba; sú rôzne triedy rýb)
extenzia
– všetky inštancie, ktoré sú rybami,
majú chovanie podľa intenzie
zdroj. doc. Vojtěch Merunka
32
Operátor instanceof – extenzia
vracia true
prvyOperand je inštanciou triedy DruhyOperand
rozšírenie
vracia true
prvyOperand patrí do extenzie triedy DruhyOperand
prvyOperand instanceof DruhyOperand
33
Vzťah has-a
vyjadrenie vzťahu celku a jeho častí
celok má časti
obdoba vzťahu is-a pre kompozíciu (skladanie)
DigitalneHodiny „má“ CiselnyDisplej
34
Prístupové právo protected
selektívne prístupové práva
„protekcia“ pre potomkov
public
– verejný prístup všetkým iným objektom
private
– zákaz prístupu všetkým iným objektom
doména – podstrom dedičnosti, daný koreň
protected
public
– každý objekt typu z domény
private
– každý objekt typu mimo domény
35
Protected
– UML
CD
AVIDielo
+dajTitul()
+dajCas()
+dajKomentar()
+pridajKomentar()
#vypisCas()
+dajAutora()
+dajPocSkl()
+vypis()
# - protected
36
Dedičnosť a návrh tried
generalizácia
špecializácia
dedičnosť – vzťah „genspec“
37
Generalizácia
KCaIB
trieda CD
trieda DVD
z nich
trieda AudiovizualneDielo
38
Samostatné triedy CD a DVD
CD
DVD
39
Vytvorenie spoločnej časti AD
AD
generalizácia: (CD, DVD) → AD
40
Nová trieda VHS
VHS
AD
špecializácia: AD → VHS
41
Nová trieda VHS
AD
VHS
DVD
CD
42
Nebezpečenstvá dedičnosti
explózia tried
nelogické použitie (zneužitie) dedičnosti
porušenie Liskovej princípu substitúcie
zvyšovanie implementačnej závislosti
43
„Technická“ dedičnosť
2
2
r
S
r
O
2
4
r
S
r
O
rb
S
b
r
O
2
2
44
„Logická“ dedičnosť
45
Barbara Liskov(*1939)
1987
– princíp
substitúcie pre typy
2004
– medaila
Jon von Neumana
2008
– cena
A. M. Turinga
46
The Liskov Substitution Principle (LSP)
Let q(x) be a property provable about objects x
of type T. Then q(y) should be true for objects y
of type S where S is a subtype of T.
Nech q(x
) je preukázateľná vlastnosť objektu x
typu T. Potom q(y
) by mala platiť pre objekt y
typu S, kde S je podtyp typu T.
47
Liskovej princíp substitúcie
Ak existuje vlastnosť predka, ktorú nemôže
potomok splniť = porušený substitučný princíp.
Ľubovoľná referencia na inštanciu predka by
mala byť nahraditeľná referenciou na inštanciu
potomka bez ovplyvnenia funkcionality.
vlastnosti
– uvedené v dokumentácii
48
Dedičnosť: Obdlznik – Stvorec
štvorec – špeciálny prípad
obdĺžnika
obe strany rovnaké
49
Dedičnosť: Obdlznik – Stvorec
50
metóda nastavSirku
public void nastavSirku(int paSirka)
{
super.nastavVysku(paSirka);
super.nastavSirku(paSirka);
}
51
Test objektov typu Obdlznik
private void pomocObsah(Obdlznik paObdlznik)
{
paObdlznik.nastavSirku(5);
paObdlznik.nastavVysku(4);
assertEquals(
20,
paObdlznik.dajSirku() * paObdlznik.dajVysku()
);
}
52
Test objektov typu Obdlznik
public void testObsahTriedaObdlznik()
{
this.pomocObsah(new Obdlznik());
}
public void testObsahTriedaStvorec()
{
this.pomocObsah(new Stvorec());
}
53
Dedičnosť: Obdlznik – Stvorec(1)
obdĺžnik a štvorec sú rôzne útvary
niektoré vlastnosti rovnaké
niektoré vlastnosti rôzne
rovnaké vlastnosti – abstraktný predok
špecifické vlastnosti – konkrétni potomkovia
polymorfizmus
– abstraktné metódy predka
implementujú potomkovia svojím spôsobom
54
Dedičnosť: Obdlznik – Stvorec(2)
55
Riziká porušenia LSP
predok a potomok sú konkrétne triedy
potomok prekrýva metódy predka
56
Znižovanie rizika porušenia LSP
implementácia abstraktných metód
zvážiť vzťah dedičnosti konkrétnych tried
zvážiť prekrývanie konkrétnej metódy predka
zvážiť využívanie metódy predka pomocou
super
v prekrývajúcej metóde
57
Java
– trieda Object
Object
equals()
toString()
boolean equals(Object paObject)
String toString()
58
Object
– toString()
textová reprezentácia objektu
String toString()
názov Triedy objektu (dynamický typ)
znak@
adresa objektu v pamäti
System.out.println(objekt)
reťazcový operátor +
objekt nie je reťazec – automatické použitie
toString
59
Object
– equals(Object paObjekt)
relácia ekvivalencie pre dva objekty (referencie)
trieda Object: ekvivalentná s operátorom ==
podmienky relácie:
x, y, z: rôzne od null
reflexívna: x.equals(x) = true
symetrická: x.equals(y)
y.equals(x)
tranzitívna: x.equals(y) and y.equals(z)
x.equals(z)
prístupová metóda, nemení stav porovnávaných
objektov
x.equals(null) = false
60
Object
– equals(Object paObjekt)
== rovnosť identity dvoch referencii
implikuje rovnosť stavov
equals
– rovnosť stavu dvoch objektov
pri prekrytí musia byť dodržané podmienky
61
Trieda Object a LSP(1)
nie je definovaná ako abstraktná
má zmysel vytvárať inštancie?
väčšinou používame ako abstraktnú
porušenie LSP?
62
Trieda Object a LSP(2)
zdedená toString od Object – má zmysel pre
potomka?
„Vytvára textovú reprezentáciu inštancie.“
dokumentácia Java
vlastnosť inštancie je definovaná
dokumentáciou.
LSP neporušujeme pri takomto chápaní
významu metódy toString.
Dedičnosť – zvyšovanie závislosti
nutnosť poznania implementácie predka
=>
porušenie zapúzdrenia
zvyšovanie implementačnej závislosti medzi
triedami
63
64
Príklad závislosti(1)
public class Katalog
{
private List<AVIDielo> aDiela;
public Katalog()
{
aDiela = new List<AVIDielo>();
}
…
}
65
Príklad závislosti(2)
public pridaj(AVIDielo paDielo)
{
aDiela.add(paDielo);
}
public pridajZoznam(List<AVIDielo> paZoznamDiel)
{
for (AVIDielo dielo : paZoznamDiel) {
this.pridaj(dielo);
}
}
Potomok s počítaním
66
public class PocitaciKatalog extends Katalog
{
private int aPocet;
public PocitaciKatalog()
{
aPocet = 0;
}
…
}
67
Príklad závislosti(2)
public pridaj(AVIDielo paDielo)
{
aPocet++;
super.pridaj(paDielo);
}
public pridajZoznam(List<AVIDielo> paZoznamDiel)
{
aPocet += paZoznamDiel.count();
super.pridajZoznam(paZoznamDiel);
}
V čom je problém?
správne počíta, ak používame správu pridaj()
ak použijeme pridajZoznam(), ráta zle
zaráta dvojnásobok
68
69
Polymorfizmus a dedičnosť(1)
polymorfizmus
– definuje chovanie objektov
vychádza zo základného princípu – posielania
správ
nezávisí od dedičnosti
„čistý“ princíp – len chovanie
70
Polymorfizmus a dedičnosť(2)
dedičnosť – definícia hierarchie typov
definuje štruktúru objektov
napĺňa princíp reuse
poskytuje implementačný komfort
môže zahŕňať aj polymorfizmus
prekrývanie metód
implementácia abstraktných metód
„zmiešaný“ princíp – štruktúra + chovanie
71
Názov „dedičnosť“(1)
dedičnosť dovoľuje zaviesť hierarchiu typov
dedičnosť – nesprávny názov
neznamená dedenie génov
neznamená dedenie majetku
72
Názov „dedičnosť“(2)
vzťah is-a, generalizácia/špecializácia
dokumentácia UML – prevažuje generalizácia
generalizácia používajú aj nástroje
odvádza pozornosť od podstaty – hierarchia
typov
– k implementačným detailom – čo trieda
dedí
73
Vytváranie inštancií tried
štyri spôsoby
klasická trieda
singleton
enum
abstraktná trieda
74
Klasická trieda
správa new – verejné rozhranie triedy
verejný konštruktor
ľubovoľný počet inštancií
extenzia
– všetky inštancie triedy a jej potomkov
75
Singleton
správa new – neverejné rozhranie triedy
neverejný konštruktor
žiadosť o inštanciu – správa dajInstanciu()
– verejné rozhranie
najviac jedna inštancia
extenzia
– najviac jedna inštancia
76
(Objektový) enum
bez správy new
konštruktor bez definovaných prístupových práv
počet inštancií je pevne daný
priamo definovaný zoznam inštancií
extenzia
– pevne daná množina inštancií
77
Abstraktná trieda
bez správy new
verejný konštruktor
ľubovoľný počet inštancií
extenzia
– všetky inštancie potomkov
78
Zabránenie prekrytia metódy
ak sa nesmie
prekrývať konkrétna metóda
zabránenie polymorfizmu danej metódy
nevzťahuje sa na preťaženie
kľúčové slovo final v hlavičke metódy
public final int dajCelkovyCas()
{
return aCelkovyCas;
}
79
Koncová trieda
odvodená trieda nemá zmysel
vždy konkrétna
všetky metódy automaticky final
kľúčové slovo final v hlavičke triedy
public final class CD
{
...
}
80
Zhrnutie(1)
Abstraktná trieda
v reálnom svete
v jazyku Java
v BlueJ/UML
Konkrétna trieda
Abstraktná metóda
v reálnom svete
v jazyku Java
81
Zhrnutie(2)
Vzťah is-a
Dedičnosť a extenzia triedy
Triáda triedy
meno
intenzia
extenzia
instanceof v hierarchii dedičnosti
82
Zhrnutie(3)
viac o LSP
riešenie problému štvorec-obdĺžnik pomocou
abstraktnej triedy
riziká porušenia LSP
znižovanie rizika
trieda Object a LSP
polymorfizmus vs dedičnosť
83
Zhrnutie(4)
vytváranie inštancií tried
klasická trieda
singleton
enum
abstraktná trieda
modifikátor final
zabránenie prekrytia metódy
koncová trieda
Ďakujem za pozornosť
Automaticky vygenerovaný textový náhľad. Pre plné formátovanie si stiahnite súbor.
nechodím na prednášky