Sobes.tech
Junior

Jak fungují klíčová slova 'super' a 'this' v Kotlinu?

sobes.tech AI

Odpověď od AI

this odkazuje na aktuální instanci třídy nebo příjemce lambda výrazu. Používá se k explicitnímu označení člena třídy nebo odkazu na aktuální objekt, když je zřejmá nejednoznačnost (například když místní proměnná má stejné jméno).

super se používá k volání metod nebo přístupu k vlastnostem rodičovské třídy. Používá se, když je třeba použít implementaci rodičovské třídy namísto přepsané implementace v aktuální třídě.

Příklady:

class MyClass(val value: Int) {
    fun printValue() {
        println(this.value) // Explicitní použití this pro přístup k vlastnosti
    }
}

open class Parent {
    open fun greet() {
        println("Ahoj od rodiče")
    }
}

class Child : Parent() {
    override fun greet() {
        super.greet() // Volání metody rodičovské třídy
        println("Ahoj od dítěte")
    }
}

Při použití v lambda funkcích může this odkazovat na příjemce lambda:

fun String.addExclamation(): String {
    return this + "!" // this odkazuje na řetězec příjemce
}

fun main() {
    val numbers = listOf(1, 2, 3)
    val sum = numbers.sum() // sum je rozšířením funkce, this uvnitř odkazuje na seznam numbers
    println(sum)
}

Pro řešení nejednoznačnosti, když máte vnořené třídy nebo lambdy s příjemci, můžete použít kvalifikované this (this@ClassName nebo this@label):

class A { // implicitní štítek @A
    inner class B { // implicitní štítek @B
        fun Int.foo() { // implicitní štítek @foo
            val a = this@A // odkaz na instanci A
            val b = this@B // odkaz na instanci B
            val c = this // odkaz na instanci Int, příjemce funkce foo
            val c1 = this@foo // odkaz na instanci Int, příjemce funkce foo
        }
    }
}