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
}
}
}