10.4 Test - Dedičnosť (10.1 - 10.3)

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