Sobes.tech
Junior

Vysvetlite, ako funguje kľúčové slovo 'super' v jazyku Kotlin.

sobes.tech AI

Odpoveď od AI

Kľúčové slovo super sa používa na prístup k členom (vlastnostiam, metódam) rodičovskej triedy z podtriedy.

Hlavné spôsoby použitia:

  1. Volanie konštruktora rodičovskej triedy: Často sa používa v konštruktore podtriedy na volanie zodpovedajúceho konštruktora rodiča. Toto je povinné, ak má rodičovská trieda primárny konštruktor s parametrami.

    open class Parent(val name: String)
    
    class Child(name: String) : Parent(name) {
        // Konštruktor Child volá konštruktor Parent,
        // odovzdávajúc parameter name.
    }
    
  2. Prístup k členom rodičovskej triedy, prepísaným v podtriede: Umožňuje pristupovať k implementácii metódy alebo vlastnosti v rodičovskej triede, aj keď boli prepísané (pomocou override) v podtriede.

    open class Base {
        open fun greet() {
            println("Hello from Base")
        }
    
        open val value: Int = 1
    }
    
    class Derived : Base() {
        override fun greet() {
            super.greet() // Volanie greet() z Base
            println("Hello from Derived")
        }
    
        override val value: Int = 2
            get() {
                println("Prístup k hodnote Derived")
                return super.value + 1 // Prístup k value z Base
            }
    }
    
  3. Prístup k členom konkrétneho supertypu (v prípade viacnásobného dedičstva rozhraní): Ak trieda implementuje viac rozhraní, ktoré majú členov s rovnakými názvami, super v spojení s uvedením názvu rozhrania v hranatých zátvorkách (super<TypeName>) umožňuje jednoznačne určiť, ku ktorému členovi ktorého rozhrania sa 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() // Volanie foo() z MyInterface1
            super<MyInterface2>.foo() // Volanie foo() z MyInterface2
        }
    }