Sobes.tech
Junior

Erklären Sie, wie das Schlüsselwort 'super' in der Kotlin-Sprache funktioniert.

sobes.tech KI

Antwort von AI

Das Schlüsselwort super wird verwendet, um auf Mitglieder (Eigenschaften, Methoden) der Elternklasse aus der Kindklasse zuzugreifen.

Hauptverwendungszwecke:

  1. Aufruf des Konstruktors der Elternklasse: Wird häufig im Konstruktor der Kindklasse verwendet, um den entsprechenden Konstruktor des Elternteils aufzurufen. Dies ist obligatorisch, wenn die Elternklasse einen primären Konstruktor mit Parametern hat.

    open class Parent(val name: String)
    
    class Child(name: String) : Parent(name) {
        // Der Konstruktor von Child ruft den Konstruktor von Parent auf,
        // indem er den Parameter name übergibt.
    }
    
  2. Zugriff auf die Mitglieder der Elternklasse, die in der Kindklasse überschrieben wurden: Ermöglicht den Zugriff auf die Implementierung einer Methode oder Eigenschaft in der Elternklasse, auch wenn sie in der Kindklasse überschrieben wurden (mit override).

    open class Base {
        open fun greet() {
            println("Hello from Base")
        }
    
        open val value: Int = 1
    }
    
    class Derived : Base() {
        override fun greet() {
            super.greet() // Aufruf von greet() aus Base
            println("Hello from Derived")
        }
    
        override val value: Int = 2
            get() {
                println("Zugriff auf Derived-Wert")
                return super.value + 1 // Zugriff auf value aus Base
            }
    }
    
  3. Zugriff auf Mitglieder eines bestimmten Supertyps (bei Mehrfachvererbung von Schnittstellen): Wenn eine Klasse mehrere Schnittstellen implementiert, die Mitglieder mit gleichen Namen haben, ermöglicht super in Verbindung mit der Angabe des Schnittstellennamens in spitzen Klammern (super<TypeName>) eine eindeutige Referenzierung.

    interface MyInterface1 {
        fun foo() { println("MyInterface1 foo") }
    }
    
    interface MyInterface2 {
        fun foo() { println("MyInterface2 foo") }
    }
    
    class MyClass : MyInterface1, MyInterface2 {
        override fun foo() {
            super<MyInterface1>.foo() // Aufruf von foo() aus MyInterface1
            super<MyInterface2>.foo() // Aufruf von foo() aus MyInterface2
        }
    }