Kľúčové slovo super odkazuje na rodičovskú triedu. Používame ho keď chceme v podtriede zavolať funkciu alebo pristúpiť k atribútu z rodiča:
open class Animal {
open fun speak() {
println("...")
}
}
class Dog : Animal() {
override fun speak() {
super.speak() // zavolame povodnu implementaciu
println("Hav!")
}
}
fun main() {
val dog = Dog()
dog.speak()
// ...
// Hav!
}
super môžeme použiť aj na zavolanie konštruktora rodičovskej triedy:
open class Animal(val name: String)
class Dog(name: String, val breed: String) : Animal(name) {
fun describe() {
println("$name je $breed")
}
}
fun main() {
val dog = Dog("Rex", "Labrador")
dog.describe() // Rex je Labrador
}
Ak trieda implementuje viacero rozhraní a obe majú rovnakú funkciu, super môžeme použiť na zavolanie konkrétnej implementácie:
interface A {
fun greet() { println("Ahoj z A") }
}
interface B {
fun greet() { println("Ahoj z B") }
}
class C : A, B {
override fun greet() {
super<A>.greet() // Ahoj z A
super<B>.greet() // Ahoj z B
}
}
Bez zátvoriek
<A>alebo<B>bysuper.greet()nevedelo, ktorú implementáciu zavolať.
V prepísanej metóde podtriedy zavolaj pomocou super aj implementáciu rodiča.
Vytvor triedu ElektrickeAuto, ktorá cez super zavolá konštruktor Auto s názvom modelu.
Vytvor dve rozhrania s rovnakou predvolenou metódou a v implementujúcej triede zavolaj obe pomocou super<...>.