150 likes | 503 Views
OOP – Zapúzdrenosť, dedičnosť, polymorfizmus Programovanie v jazyku JAVA. Mgr. Lukáš Zmuda. lukas.zmuda@gmail.com. oop zapúzdrenie dedičnosť polymorfizmus. 3 piliere OOP. Mgr. Lukáš Zmuda. OOP – Zapúzdrenie, dedičnosť, polymorfizmus. oop zapúzdrenie dedičnosť polymorfizmus.
E N D
OOP – Zapúzdrenosť, dedičnosť, polymorfizmus Programovanie v jazyku JAVA Mgr. Lukáš Zmuda lukas.zmuda@gmail.com
oop zapúzdrenie dedičnosť polymorfizmus 3 piliere OOP 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 classBankovyUcet{ int zostatok; } public classBankovyUcetUtils{ public double getRocnyUrok(){...} } public classBankovyUcet{ int zostatok; public double getRocnyUrok(){...} } Mgr. Lukáš Zmuda 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 classBankovyUcet{ publicint zostatok; } … a nainommieste … BankovyUcetmojUcet= 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 publicclass Konto { privatedoublezostatok; public Konto(double suma) { this.zostatok = suma; } public Konto() { zostatok = 0.0; } publicvoid vklad(double suma) { zostatok += suma; } publicdouble vyber(double suma) { if (zostatok >= suma) { zostatok -= suma; returnzostatok; } else { System.out.println("Nematedostatocne prostriedky na ucte"); return 0.0; } } publicdoublegetZostatok() { returnzostatok; } publicvoidsetZostatok(double suma) { this.zostatok = suma; } } publicclassSporiaceKontoextendsKonto { privatefinaldoubleDEFAULT_UROK = 5.85; privatedoubleaktualnyUrok; publicSporiaceKonto(doublesuma, doubleurok) { super(suma); aktualnyUrok = urok; } publicSporiaceKonto(double suma) { super(suma); aktualnyUrok = DEFAULT_UROK; } publicSporiaceKonto() { //super(); aktualnyUrok = DEFAULT_UROK; } publicvoidpridajMesacnyUrok() { 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 publicclassSporiaceKontoextendsKonto { privatefinaldoubleDEFAULT_UROK = 5.85; privatedoubleaktualnyUrok; publicSporiaceKonto(doublesuma, doubleurok) { super(suma); aktualnyUrok = urok; } publicSporiaceKonto(double suma) { super(suma); aktualnyUrok = DEFAULT_UROK; } publicSporiaceKonto() { //super(); aktualnyUrok = DEFAULT_UROK; } publicvoidpridajMesacnyUrok() { setZostatok(getZostatok() + (getZostatok() * aktualnyUrok/100)/12); } } • triedu SporiaceKonto dediacu od triedy Konto deklarujeme pomocou kľúčového slova extends • triedu Konto nazývame predkom alebo nadtriedou (superclass) • triedu SporiaceKonto nazývame potomkom alebo podtriedou (subclass) triedy Konto Mgr. Lukáš Zmuda OOP – Zapúzdrenie, dedičnosť, polymorfizmus
oop zapúzdrenie dedičnosť polymorfizmus Dedičnosť – príklad Konto, SporiaceKonto publicclassSporiaceKontoextendsKonto { privatefinaldoubleDEFAULT_UROK = 5.85; privatedoubleaktualnyUrok; publicSporiaceKonto(doublesuma, doubleurok) { super(suma); aktualnyUrok = urok; } publicSporiaceKonto(double suma) { super(suma); aktualnyUrok = DEFAULT_UROK; } publicSporiaceKonto() { //super(); aktualnyUrok = DEFAULT_UROK; } publicvoidpridajMesacnyUrok() { setZostatok(getZostatok() + (getZostatok() * aktualnyUrok/100)/12); } } • konštruktory sa v Jave NEDEDIA!! • prvým príkazom v každom konštruktore potomka musí byť volanie konštruktora predka, pomocou kľúčového slova super • ak má predok bezparametrický konštruktor toto volanie v konštruktoroch potomka nemusíme písať, Java to urobí za nás sama 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