OOP – Zapúzdrenosť, dedičnosť, polymorfizmus Programovanie v jazyku JAVA Mgr. Lukáš Zmuda [email protected] oop zapúzdrenie dedičnosť polymorfizmus 3 piliere OOP polymorfizmus zapúzdrenie • prekrývanie rodičovských metód metódami potomka s rovnakou hlavičkou (názov a parametre) • triedy.

Download Report

Transcript OOP – Zapúzdrenosť, dedičnosť, polymorfizmus Programovanie v jazyku JAVA Mgr. Lukáš Zmuda [email protected] oop zapúzdrenie dedičnosť polymorfizmus 3 piliere OOP polymorfizmus zapúzdrenie • prekrývanie rodičovských metód metódami potomka s rovnakou hlavičkou (názov a parametre) • triedy.

OOP – Zapúzdrenosť, dedičnosť, polymorfizmus
Programovanie v jazyku JAVA
Mgr. Lukáš Zmuda
[email protected]
oop
zapúzdrenie
dedičnosť
polymorfizmus
3 piliere OOP
polymorfizmus
zapúzdrenie
• prekrývanie
rodičovských metód
metódami potomka s
rovnakou hlavičkou
(názov a parametre)
• triedy sú uzavreté
„skrinky“ s jasne
určenými operáciami
dedičnosť
• trieda odvodená od inej triedy
„zdedí“ všetky premenné a
metódy rodičovskej triedy a
naviac môže doplniť ďalšie
Mgr. Lukáš Zmuda
OOP – Zapúzdrenie, dedičnosť, polymorfizmus
oop
zapúzdrenie
dedičnosť
polymorfizmus
Zapúzdrenie (encapsulation)
- o to ako trieda funguje by sa mala starať iba sama trieda a iné triedy o tom nemusia vedieť
Zásada č. 1: Dáta a operácie nad nimi nech sú v rovnakej triede.
public class BankovyUcet {
int zostatok;
public class BankovyUcet {
int zostatok;
}
public class BankovyUcetUtils {
public double getRocnyUrok(){...}
}
Mgr. Lukáš Zmuda
public double getRocnyUrok(){...}
}
OOP – Zapúzdrenie, dedičnosť, polymorfizmus
oop
zapúzdrenie
dedičnosť
polymorfizmus
Zapúzdrenie (encapsulation)
Zásada č. 2: Nezverejňujte detaily o internom stave triedy
public class BankovyUcet {
public int zostatok;
}
… a na inom mieste …
BankovyUcet mojUcet = new BankovyUcet();
mojUcet.zostatok = Integer.MIN_VALUE;
•
•
•
•
používajte modifikátory viditeľnosti (public, private, protected)
inštančné premenné = private!
prístup k inštančným premenným cez gettre a settre
potrebujete ich vôbec?
Mgr. Lukáš Zmuda
OOP – Zapúzdrenie, dedičnosť, polymorfizmus
oop
zapúzdrenie
dedičnosť
polymorfizmus
Zapúzdrenie (encapsulation)
Zásada č. 3: Nezverejňujte vnútornú štruktúru triedy
• trieda = „čierna skrinka“
• všetko je schované za public metódami
Mgr. Lukáš Zmuda
OOP – Zapúzdrenie, dedičnosť, polymorfizmus
oop
zapúzdrenie
dedičnosť
polymorfizmus
Zapúzdrenie (encapsulation) – čo si z toho všetkého mám zapamätať????
 dáta, ktoré spravuje objekt sú uložené v privátnych inštančných
premenných daného objektu
 dáta môžeme spravovať len cez metódy objektu, v ktorom sa nachádzajú
dáta (gettre, settre)
 najhorší a neodporúčaný postup je priame napĺňanie inštančných
premenných zvonku cez bodkovú notáciu
 s objektmi chceme komunikovať, nie hrabať sa v ich inštančných
premenných !!!!!
Mgr. Lukáš Zmuda
OOP – Zapúzdrenie, dedičnosť, polymorfizmus
oop
zapúzdrenie
dedičnosť
polymorfizmus
Dedičnosť
• umožňuje nám odvodiť triedu od inej triedy
• odvodená trieda „zdedí“ všetky premenné a metódy
pôvodnej triedy, môže k nim doplniť ďalšie prípadne
nahradiť zdedené novými
Mgr. Lukáš Zmuda
OOP – Zapúzdrenie, dedičnosť, polymorfizmus
oop
zapúzdrenie
dedičnosť
polymorfizmus
Dedičnosť – príklad Konto, SporiaceKonto – diagram tried
Mgr. Lukáš Zmuda
OOP – Zapúzdrenie, dedičnosť, polymorfizmus
oop
zapúzdrenie
dedičnosť
polymorfizmus
Dedičnosť – príklad Konto, SporiaceKonto
public class Konto {
private double zostatok;
public Konto(double suma) {
this.zostatok = suma;
}
public Konto() {
zostatok = 0.0;
}
public void vklad(double suma) {
zostatok += suma;
}
public double vyber(double suma) {
if (zostatok >= suma) {
zostatok -= suma;
return zostatok;
} else {
System.out.println("Nemate dostatocne
prostriedky na ucte");
return 0.0;
}
}
public double getZostatok() {
return zostatok;
}
public void setZostatok(double suma) {
this.zostatok = suma;
}
}
Mgr. Lukáš Zmuda
public class SporiaceKonto extends Konto {
private final double DEFAULT_UROK = 5.85;
private double aktualnyUrok;
public SporiaceKonto(double suma, double
urok) {
super(suma);
aktualnyUrok = urok;
}
public SporiaceKonto(double suma) {
super(suma);
aktualnyUrok = DEFAULT_UROK;
}
public SporiaceKonto() {
//super();
aktualnyUrok = DEFAULT_UROK;
}
public void pridajMesacnyUrok() {
setZostatok(getZostatok() + (getZostatok() *
aktualnyUrok/100)/12);
}
}
OOP – Zapúzdrenie, dedičnosť, polymorfizmus
oop
zapúzdrenie
dedičnosť
polymorfizmus
Dedičnosť – príklad Konto, SporiaceKonto
public class SporiaceKonto extends Konto {
private final double DEFAULT_UROK = 5.85;
private double aktualnyUrok;
• triedu SporiaceKonto
dediacu od triedy Konto
deklarujeme pomocou kľúčového
slova extends
public SporiaceKonto(double suma, double
urok) {
super(suma);
aktualnyUrok = urok;
}
public SporiaceKonto(double suma) {
super(suma);
aktualnyUrok = DEFAULT_UROK;
}
• triedu Konto nazývame
predkom alebo nadtriedou
(superclass)
public SporiaceKonto() {
//super();
aktualnyUrok = DEFAULT_UROK;
}
• triedu SporiaceKonto
nazývame potomkom alebo
podtriedou (subclass) triedy
Konto
public void pridajMesacnyUrok() {
setZostatok(getZostatok() + (getZostatok() *
aktualnyUrok/100)/12);
}
}
Mgr. Lukáš Zmuda
OOP – Zapúzdrenie, dedičnosť, polymorfizmus
oop
zapúzdrenie
dedičnosť
polymorfizmus
Dedičnosť – príklad Konto, SporiaceKonto
public class SporiaceKonto extends Konto {
private final double DEFAULT_UROK = 5.85;
private double aktualnyUrok;
• konštruktory sa v Jave
NEDEDIA!!
public SporiaceKonto(double suma, double
urok) {
super(suma);
aktualnyUrok = urok;
}
• prvým príkazom v každom
konštruktore potomka musí byť
volanie konštruktora predka,
pomocou kľúčového slova super
public SporiaceKonto(double suma) {
super(suma);
aktualnyUrok = DEFAULT_UROK;
}
public SporiaceKonto() {
//super();
aktualnyUrok = DEFAULT_UROK;
}
• ak má predok bezparametrický
konštruktor toto volanie v
konštruktoroch potomka
nemusíme písať, Java to urobí za
nás sama
public void pridajMesacnyUrok() {
setZostatok(getZostatok() + (getZostatok() *
aktualnyUrok/100)/12);
}
}
Mgr. Lukáš Zmuda
OOP – Zapúzdrenie, dedičnosť, polymorfizmus
oop
zapúzdrenie
dedičnosť
polymorfizmus
Dedičnosť – kedy ju mám použiť???
 používame ju vtedy, keď dediaca trieda má mať a má vedieť všetko, čo jej
predok
 dediči sú podmnožinou predkov
overte či platí vzťah rodič - dieťa
Mgr. Lukáš Zmuda
OOP – Zapúzdrenie, dedičnosť, polymorfizmus
oop
zapúzdrenie
dedičnosť
polymorfizmus
Polymorfizmus
Mgr. Lukáš Zmuda
OOP – Zapúzdrenie, dedičnosť, polymorfizmus
oop
zapúzdrenie
dedičnosť
polymorfizmus
Polymorfizmus
• sk.: viactvarovosť (slovenský ekvivalent nikto nepoužíva)
• ak v potomkovi definujeme metódu s rovnakou hlavičkou (názvom a
parametrami) ako je definovaná v predkovi, túto metódu prekryjeme. Pri
volaní sa potom vždy zavolá táto metóda od potomka
•je to dôsledok volania metód:
• keď cez niektorú premennú referencujúcu daný objekt zavoláme
nejakú metódu, postupuje sa nasledovne:
•Ak je v triede tohto objektu takáto metóda definovaná, zavolá
sa
•Ak nie, pozrieme sa do jej rodičovskej triedy. Ak sa tam táto
metóda nachádza, vykoná sa, inak postupujeme v hierarchii
vyššie, až kým na túto metódu nenarazíme a vykonáme ju.
Mgr. Lukáš Zmuda
OOP – Zapúzdrenie, dedičnosť, polymorfizmus