Sobes.tech
Junior

Wyjaśnij, jak działa słowo kluczowe 'super' w języku Kotlin.

sobes.tech AI

Odpowiedź od AI

Słowo kluczowe super jest używane do dostępu do członków (właściwości, metod) klasy nadrzędnej z klasy potomnej.

Główne sposoby użycia:

  1. Wywołanie konstruktora klasy nadrzędnej: Często używane w konstruktorze klasy potomnej do wywołania odpowiedniego konstruktora klasy nadrzędnej. Jest to obowiązkowe, jeśli klasa nadrzędna ma główny konstruktor z parametrami.

    open class Parent(val name: String)
    
    class Child(name: String) : Parent(name) {
        // Konstruktor Child wywołuje konstruktor Parent,
        // przekazując parametr name.
    }
    
  2. Dostęp do członków klasy nadrzędnej, nadpisanych w klasie potomnej: Pozwala na dostęp do implementacji metody lub właściwości w klasie nadrzędnej, nawet jeśli zostały nadpisane (za pomocą override) w klasie potomnej.

    open class Base {
        open fun greet() {
            println("Hello from Base")
        }
    
        open val value: Int = 1
    }
    
    class Derived : Base() {
        override fun greet() {
            super.greet() // Wywołanie greet() z Base
            println("Hello from Derived")
        }
    
        override val value: Int = 2
            get() {
                println("Dostęp do wartości Derived")
                return super.value + 1 // Dostęp do value z Base
            }
    }
    
  3. Dostęp do członków konkretnego supertypu (w przypadku wielokrotnego dziedziczenia interfejsów): Jeśli klasa implementuje wiele interfejsów, które mają członków o tych samych nazwach, super wraz z określeniem nazwy interfejsu w nawiasach kątowych (super<TypeName>) pozwala jednoznacznie wskazać, do którego członka którego interfejsu się odwołać.

    interface MyInterface1 {
        fun foo() { println("MyInterface1 foo") }
    }
    
    interface MyInterface2 {
        fun foo() { println("MyInterface2 foo") }
    }
    
    class MyClass : MyInterface1, MyInterface2 {
        override fun foo() {
            super<MyInterface1>.foo() // Wywołanie foo() z MyInterface1
            super<MyInterface2>.foo() // Wywołanie foo() z MyInterface2
        }
    }