Sobes.tech
Junior

Paaiškinkite, kaip veikia raktažodis 'super' Kotlin kalboje.

sobes.tech AI

Atsakymas iš AI

Raktinis žodis super naudojamas prieiti prie tėvų klasės narių (savybių, metodų) iš vaikų klasės.

Pagrindiniai naudojimo būdai:

  1. Tėvų klasės konstruktoriaus iškvietimas: Dažnai naudojama vaikų klasės konstruktoriuje, kad iškviestų atitinkamą tėvų konstruktorių. Tai yra būtina, jei tėvų klasė turi pagrindinį konstruktorių su parametrais:

    open class Parent(val name: String)
    
    class Child(name: String) : Parent(name) {
        // Child konstruktorius iškviečia Parent konstruktorių,
        // perduodamas parametrą name.
    }
    
  2. Prieiga prie tėvų klasės perrašytų narių: Leidžia kreiptis į tėvų klasės metodo ar savybės įgyvendinimą, net jei jie buvo perrašyti (naudojant override) vaikų klasėje:

    open class Base {
        open fun greet() {
            println("Hello from Base")
        }
    
        open val value: Int = 1
    }
    
    class Derived : Base() {
        override fun greet() {
            super.greet() // Kviečia Base greet()
            println("Hello from Derived")
        }
    
        override val value: Int = 2
            get() {
                println("Accessing Derived value")
                return super.value + 1 // Prieiga prie Base value
            }
    }
    
  3. Prieiga prie konkretaus supertipų narių (dėl kelių įgyvendinamų sąsajų): Jei klasė įgyvendina kelias sąsajas, kurios turi vienodų pavadinimų narius, super kartu su sąsajos pavadinimu skliausteliuose (super<TypeName>) leidžia aiškiai nurodyti, prie kurio nario ir kokios sąsajos kreiptis:

    interface MyInterface1 {
        fun foo() { println("MyInterface1 foo") }
    }
    
    interface MyInterface2 {
        fun foo() { println("MyInterface2 foo") }
    }
    
    class MyClass : MyInterface1, MyInterface2 {
        override fun foo() {
            super<MyInterface1>.foo() // Kviečia MyInterface1 foo()
            super<MyInterface2>.foo() // Kviečia MyInterface2 foo()
        }
    }