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 ReportTranscript 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