Sobes.tech
Junior

Izskaidrojiet, kā darbojas atslēgvārds 'super' Kotlin valodā.

sobes.tech AI

Atbilde no AI

Galvenais vārds super tiek izmantots, lai piekļūtu vecāku klases locekļiem (īpašībām, metodēm) no bērnu klases.

Galvenie lietošanas veidi:

  1. Vecāku klases konstruktora izsaukšana: Bieži tiek izmantots bērnu klases konstruktora iekšienē, lai izsauktu atbilstošo vecāku konstruktora. Tas ir obligāti, ja vecāku klasei ir galvenais konstruktors ar parametriem:

    open class Parent(val name: String)
    
    class Child(name: String) : Parent(name) {
        // Child konstruktors izsauc Parent konstruktoru,
        // nododot parametru name.
    }
    
  2. Pieeja vecāku klases pārdefinētajiem locekļiem: ļauj piekļūt vecāku klases metodes vai īpašības realizācijai, pat ja tās ir pārdefinētas (izmantojot override) bērnu klases iekšienē:

    open class Base {
        open fun greet() {
            println("Hello from Base")
        }
    
        open val value: Int = 1
    }
    
    class Derived : Base() {
        override fun greet() {
            super.greet() // Izsauc Base metodi greet()
            println("Hello from Derived")
        }
    
        override val value: Int = 2
            get() {
                println("Pieeja Derived vērtībai")
                return super.value + 1 // Pieeja Base vērtībai
            }
    }
    
  3. Pieeja konkrētam supertipa loceklim (ja ir vairākas interfaces): Ja klase realizē vairākas interfaces, kas satur vienādus locekļus, super kopā ar interfaces nosaukumu iekavās (super<TypeName>) ļauj precīzi norādīt, uz kuru locekli un no kura interface vērsieties:

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