Sobes.tech
Junior

Kā darbojas atslēgvārdi 'super' un 'this' Kotlin?

sobes.tech AI

Atbilde no AI

this atsaucas uz aktuālo klases piemēru vai lambda izteiksmes saņēmēju. To izmanto, lai skaidri norādītu klases locekli vai atsauci uz aktuālo objektu, kad būtu skaidrība (piemēram, ja ir vietējs mainīgais ar to pašu nosaukumu).

super tiek izmantots, lai izsauktu vecāku klases metodes vai piekļūtu īpašībām. To izmanto, kad nepieciešams izmantot vecāku klases realizāciju vietā, kur ir pārrakstīta realizācija pašreizējā klasē.

Piemēri:

class MyClass(val value: Int) {
    fun printValue() {
        println(this.value) // skaidra `this` izmantošana piekļuvei īpašībai
    }
}

open class Parent {
    open fun greet() {
        println("Sveiciens no vecāka")
    }
}

class Child : Parent() {
    override fun greet() {
        super.greet() // izsauc vecāku klases metodi
        println("Sveiciens no bērna")
    }
}

Lambda izteiksmēs this var attiekties uz saņēmēju:

fun String.addExclamation(): String {
    return this + "!" // `this` attiecas uz virknes saņēmēju
}

fun main() {
    val numbers = listOf(1, 2, 3)
    val sum = numbers.sum() // `sum` ir paplašināšanas funkcija, `this` attiecas uz sarakstu `numbers`
    println(sum)
}

Lai novērstu neskaidrības, ja ir iekšējās klases vai lambda ar saņēmējiem, var izmantot kvalificētu this (piemēram, this@ClassName vai this@label).

class A { // nenoteikts zīmogs @A
    inner class B { // nenoteikts zīmogs @B
        fun Int.foo() { // nenoteikts zīmogs @foo
            val a = this@A // atsauce uz A instanci
            val b = this@B // atsauce uz B instanci
            val c = this // Int instanci, kas ir `foo` funkcijas saņēmējs
            val c1 = this@foo // Int instanci, kas ir `foo` funkcijas saņēmējs
        }
    }
}