Over si svoje vedomosti z kapitol o dedičnosti - kľúčové slová open, override a super. Klikni na Áno alebo Nie - tlačidlo sa hneď zafarbí (zelená = správne, červená = nesprávne) a zobrazí sa komentár s vysvetlením. Otázky prechádzaš po jednej pomocou tlačidiel nižšie.
Otázka 1 / 16
Všetky triedy v Kotline sú implicitne final, teda z nich bežne nemôžeme dediť.
Áno. Ak chceme z triedy dediť, musíme ju explicitne označiť kľúčovým slovom open.
Zápis class Dog : Animal() bez toho, aby bola trieda Animal označená open, sa skompiluje bez problémov.
Nie. Bez open je trieda final a pokus o dedenie z nej spôsobí chybu kompilácie.
Kotlin má triedy predvolene final z bezpečnostných dôvodov - na rozdiel od Javy, kde sú triedy implicitne open.
Áno. Musíme sa explicitne rozhodnúť, že chceme umožniť dedičnosť, pomocou kľúčového slova open.
Kľúčové slovo override použijeme, keď chceme v podtriede zmeniť správanie funkcie z rodičovskej triedy.
Áno. Funkciu môžeme prepísať len vtedy, ak je v rodičovskej triede zároveň označená ako open.
Ak je funkcia v rodičovskej triede open, môžeme ju v podtriede prepísať aj bez použitia kľúčového slova override.
Nie. override je v Kotline povinné - bez neho funkciu prepísať nemôžeme, aj keby bola v rodičovi open.
Rovnako ako funkcie, môžeme v Kotline prepisovať aj atribúty pomocou open val a override val.
Áno. Napríklad open val color: String = "Biela" v rodičovi a override val color: String = "Cervena" v podtriede.
Kľúčové slovo super použijeme, keď chceme z podtriedy zavolať pôvodnú implementáciu funkcie z rodičovskej triedy.
Áno. Napríklad super.speak() v prepísanej metóde zavolá pôvodnú implementáciu z rodičovskej triedy pred vykonaním vlastného kódu.
super môžeme použiť aj na zavolanie konštruktora rodičovskej triedy, napríklad class Dog(name: String) : Animal(name).
Áno. Volanie konštruktora rodičovskej triedy je súčasťou dedičnosti - zápis : Animal(name) zavolá konštruktor rodiča priamo.
Ak trieda implementuje dve rozhrania s rovnakou predvolenou metódou, Kotlin si automaticky vyberie implementáciu podľa poradia dedičnosti.
Nie. V takom prípade musíme metódu prepísať a explicitne zvoliť, ktorú implementáciu chceme zavolať, pomocou zápisu super<A>.greet().
Zápis super<A>.greet() slúži na explicitné určenie, z ktorého rozhrania sa má predvolená metóda zavolať.
Áno. Bez zátvoriek <A> by kompilátor nevedel, ktorú z viacerých implementácií má zavolať.
Trieda Dog : Animal() dedí od Animal všetky jej verejné (napr. public) funkcie a atribúty.
Áno. Podtrieda automaticky získava prístup k verejným funkciám a atribútom rodičovskej triedy.
Funkcia z rodičovskej triedy, ktorá nie je označená open, sa dá v podtriede prepísať, ak použijeme kľúčové slovo override.
Nie. Bez open na strane rodiča kompilátor prepísanie zamietne bez ohľadu na override v podtriede.
Zoznam objektov rôznych podtried môžeme uložiť do premennej typu rodičovskej triedy a zavolať na nich prepísanú metódu.
Áno. Toto je typický príklad polymorfizmu - pri volaní sa vždy použije konkrétna (prepísaná) implementácia danej podtriedy.
Konštruktor rodičovskej triedy sa zavolá automaticky aj bez toho, aby sme ho explicitne uviedli v hlavičke podtriedy.
Nie. Pri dedení z triedy (nie rozhrania) musíme konštruktor rodiča vždy explicitne zavolať, napr. : Animal(name).
Rozhranie môže mať predvolenú (default) implementáciu funkcie, ktorú trieda dedičiaca viacero rozhraní môže potrebovať vyriešiť pomocou super<...>.
Áno. Ide presne o prípad, keď dve rozhrania definujú rovnakú predvolenú metódu a je nutné explicitne vybrať, ktorú zavolať.
Volanie super.speak() na začiatku prepísanej funkcie umožňuje kombinovať pôvodné správanie rodiča s novým správaním podtriedy.
Áno. Takto nemusíme duplikovať kód rodiča - jednoducho ho zavoláme a pridáme vlastnú logiku.
Tvoje skóre je 0 / 16