Sobes.tech
Junior

Magyarázza el, hogyan működik a 'super' kulcsszó a Kotlin nyelvben.

sobes.tech MI

Válasz az MI-től

A super kulcsszó arra szolgál, hogy hozzáférjünk a szülőosztály (szülőosztályok) tagjaihoz (tulajdonságok, metódusok) az alosztályból.

Főbb használati módok:

  1. A szülőosztály konstruktorának hívása: Gyakran használják az alosztály konstruktorában a megfelelő szülő konstruktorának meghívására. Ez kötelező, ha a szülőosztálynak van elsődleges konstruktor paraméterekkel.

    open class Parent(val name: String)
    
    class Child(name: String) : Parent(name) {
        // A Child konstruktor hívja a Parent konstruktorát,
        // átadva a name paramétert.
    }
    
  2. A szülőosztály tagjaihoz való hozzáférés, felülírtak esetén: Lehetővé teszi, hogy hozzáférjünk a szülőosztály metódusának vagy tulajdonságának implementációjához, még akkor is, ha azokat felülírták (override) a gyermekosztályban.

    open class Base {
        open fun greet() {
            println("Hello from Base")
        }
    
        open val value: Int = 1
    }
    
    class Derived : Base() {
        override fun greet() {
            super.greet() // A Base-ből hívás
            println("Derived-ből üdvözlet")
        }
    
        override val value: Int = 2
            get() {
                println("Hozzáférés a Derived értékéhez")
                return super.value + 1 // Hozzáférés a Base értékéhez
            }
    }
    
  3. Hozzáférés egy adott szuper típus tagjaihoz (többszörös öröklés esetén): Ha egy osztály több interfészt valósít meg, amelyek ugyanazokat a tagokat tartalmazzák, a super a szögletes zárójelekben (super<TypeName>) megadva egyértelművé teszi, hogy melyik interfész melyik tagjára hivatkozunk.

    interface MyInterface1 {
        fun foo() { println("MyInterface1 foo") }
    }
    
    interface MyInterface2 {
        fun foo() { println("MyInterface2 foo") }
    }
    
    class MyClass : MyInterface1, MyInterface2 {
        override fun foo() {
            super<MyInterface1>.foo() // A MyInterface1-ből hívás
            super<MyInterface2>.foo() // A MyInterface2-ből hívás
        }
    }