Sobes.tech
Junior

Kaip veikia raktiniai žodžiai 'super' ir 'this' Kotlin?

sobes.tech AI

Atsakymas iš AI

this nuorodoja į dabartinį klasės egzempliorių arba lambda išraiškos gavėją. Naudojama aiškiai nurodyti klasės narį arba nuorodą į dabartinį objektą, kai kyla neaiškumų (pavyzdžiui, kai yra vietinis kintamasis su tuo pačiu pavadinimu).

super naudojamas iš tėvų klasės iškviesti metodus arba pasiekti savybes. Taikoma, kai reikia naudoti tėvų klasės įgyvendinimą vietoje perrašyto įgyvendinimo dabartinėje klasėje.

Pavyzdžiai:

class MyClass(val value: Int) {
    fun printValue() {
        println(this.value) // aiškus `this` naudojimas prieigos prie savybės
    }
}

open class Parent {
    open fun greet() {
        println("Sveikinimas iš tėvo")
    }
}

class Child : Parent() {
    override fun greet() {
        super.greet() // iškviečia tėvų klasės metodą
        println("Sveikinimas iš vaiko")
    }
}

Lambda funkcijose this gali būti nuoroda į gavėją:

fun String.addExclamation(): String {
    return this + "!" // `this` nuoroda į eilutės gavėją
}

fun main() {
    val numbers = listOf(1, 2, 3)
    val sum = numbers.sum() // `sum` yra išplėtimo funkcija, `this` nuoroda į sąrašą `numbers`
    println(sum)
}

Siekiant išspręsti neaiškumą, kai turite vidinius klases arba lambda su gavėjais, galite naudoti kvalifikuotą this (pavyzdžiui, this@ClassName arba this@label).

class A { // neaiškus žymeklis @A
    inner class B { // neaiškus žymeklis @B
        fun Int.foo() { // neaiškus žymeklis @foo
            val a = this@A // nuoroda į A egzempliorių
            val b = this@B // nuoroda į B egzempliorių
            val c = this // nuoroda į Int egzempliorių, kuris yra `foo` funkcijos gavėjas
            val c1 = this@foo // nuoroda į Int egzempliorių, kuris yra `foo` funkcijos gavėjas
        }
    }
}