Sobes.tech
Junior

Vysvětlete, jak funguje klíčové slovo 'super' v jazyce Kotlin.

sobes.tech AI

Odpověď od AI

Klíčové slovo super se používá k přístupu k členům (vlastnostem, metodám) rodičovské třídy z podtřídy.

Hlavní způsoby použití:

  1. Volání konstruktoru rodičovské třídy: Často se používá v konstruktoru podtřídy k volání odpovídajícího konstruktoru rodiče. To je povinné, pokud má rodičovská třída primární konstruktor s parametry.

    open class Parent(val name: String)
    
    class Child(name: String) : Parent(name) {
        // Konstruktor Child volá konstruktor Parent,
        // předáváním parametru name.
    }
    
  2. Přístup k členům rodičovské třídy, které jsou přepsány v podtřídě: Umožňuje přístup k implementaci metody nebo vlastnosti v rodičovské třídě, i když byly přepsány (pomocí override) v podtřídě.

    open class Base {
        open fun greet() {
            println("Hello from Base")
        }
    
        open val value: Int = 1
    }
    
    class Derived : Base() {
        override fun greet() {
            super.greet() // Volání greet() z Base
            println("Hello from Derived")
        }
    
        override val value: Int = 2
            get() {
                println("Přístup k hodnotě Derived")
                return super.value + 1 // Přístup k value z Base
            }
    }
    
  3. Přístup k členům konkrétního supertypu (v případě vícenásobného dědičnosti rozhraní): Pokud třída implementuje několik rozhraní, která mají členy se stejnými názvy, super ve spojení s uvedením názvu rozhraní v hranatých závorkách (super<TypeName>) umožňuje jednoznačně určit, ke kterému členu kterého rozhraní se odkazuje.

    interface MyInterface1 {
        fun foo() { println("MyInterface1 foo") }
    }
    
    interface MyInterface2 {
        fun foo() { println("MyInterface2 foo") }
    }
    
    class MyClass : MyInterface1, MyInterface2 {
        override fun foo() {
            super<MyInterface1>.foo() // Volání foo() z MyInterface1
            super<MyInterface2>.foo() // Volání foo() z MyInterface2
        }
    }