Sobes.tech
Junior

Objasnite kako funkcioni ključna reč 'super' u jeziku Kotlin.

sobes.tech АИ

Одговор од АИ

Ključna riječ super koristi se za pristup članovima (svojstvima, metodama) roditeljske klase iz podklase.

Glavni načini korištenja:

  1. Pozivanje konstruktora roditeljske klase: Često se koristi u konstruktoru podklase za pozivanje odgovarajućeg konstruktora roditelja. To je obavezno ako roditeljska klasa ima primarni konstruktor s parametrima.

    open class Parent(val name: String)
    
    class Child(name: String) : Parent(name) {
        // Konstruktor Child poziva konstruktor Parent,
        // prosljeđujući parametar name.
    }
    
  2. Pristup članovima roditeljske klase, prepisanim u podklasi: Omogućava pristup implementaciji metode ili svojstva u roditeljskoj klasi, čak i ako su prepisani (pomoću override) u podklasi.

    open class Base {
        open fun greet() {
            println("Hello from Base")
        }
    
        open val value: Int = 1
    }
    
    class Derived : Base() {
        override fun greet() {
            super.greet() // Poziv na greet() iz Base
            println("Hello from Derived")
        }
    
        override val value: Int = 2
            get() {
                println("Pristup vrijednosti Derived")
                return super.value + 1 // Pristup value iz Base
            }
    }
    
  3. Pristup članovima određenog supertipa (u slučaju višestrukog nasljeđivanja sučelja): Ako klasa implementira više sučelja koja imaju članove s istim imenima, super u kombinaciji s navodom imena sučelja u uglastim zagradama (super<TypeName>) omogućava jednoznačno upućivanje na koji član kojeg sučelja se odnosi.

    interface MyInterface1 {
        fun foo() { println("MyInterface1 foo") }
    }
    
    interface MyInterface2 {
        fun foo() { println("MyInterface2 foo") }
    }
    
    class MyClass : MyInterface1, MyInterface2 {
        override fun foo() {
            super<MyInterface1>.foo() // Poziv na foo() iz MyInterface1
            super<MyInterface2>.foo() // Poziv na foo() iz MyInterface2
        }
    }