Sobes.tech
Junior

Обяснете как работи ключовата дума 'super' в езика Kotlin.

sobes.tech AI

Отговор от AI

Ключовата дума super се използва за достъп до членове (свойства, методи) на родителския клас от дъщерния клас.

Основни начини на използване:

  1. Обаждане на конструктора на родителския клас: Често се използва в конструктора на дъщерния клас за извикване на съответния конструктор на родителя. Това е задължително, ако родителският клас има първичен конструктор с параметри.

    open class Parent(val name: String)
    
    class Child(name: String) : Parent(name) {
        // Конструкторът на Child извиква конструктора на Parent,
        // предавайки параметъра name.
    }
    
  2. Достъп до членове на родителския клас, преписани в дъщерния: Позволява да се обърнете към реализацията на метода или свойството в родителския клас, дори ако те са преписани (чрез override) в дъщерния.

    open class Base {
        open fun greet() {
            println("Hello from Base")
        }
    
        open val value: Int = 1
    }
    
    class Derived : Base() {
        override fun greet() {
            super.greet() // Обаждане на greet() от Base
            println("Hello from Derived")
        }
    
        override val value: Int = 2
            get() {
                println("Достъп до стойността на Derived")
                return super.value + 1 // Достъп до value от Base
            }
    }
    
  3. Достъп до членове на конкретен супертип (в случай на множествено наследяване на интерфейси): Ако клас реализира няколко интерфейса, които имат членове с еднакви имена, super в съчетание с посочване на името на интерфейса в ъглови скоби (super<TypeName>) позволява ясно да се посочи към кой член на кой интерфейс се отнася.

    interface MyInterface1 {
        fun foo() { println("MyInterface1 foo") }
    }
    
    interface MyInterface2 {
        fun foo() { println("MyInterface2 foo") }
    }
    
    class MyClass : MyInterface1, MyInterface2 {
        override fun foo() {
            super<MyInterface1>.foo() // Обаждане на foo() от MyInterface1
            super<MyInterface2>.foo() // Обаждане на foo() от MyInterface2
        }
    }