Študijné materiály

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!
}

10.3.1 Super v konštruktore

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
}

10.3.2 Super v rozhraniach

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> by super.greet() nevedelo, ktorú implementáciu zavolať.

Úlohy

Úloha 1

V prepísanej metóde podtriedy zavolaj pomocou super aj implementáciu rodiča.

Úloha 2

Vytvor triedu ElektrickeAuto, ktorá cez super zavolá konštruktor Auto s názvom modelu.

Úloha 3

Vytvor dve rozhrania s rovnakou predvolenou metódou a v implementujúcej triede zavolaj obe pomocou super<...>.