Sobes.tech
Junior

Comment fonctionnent les mots-clés 'super' et 'this' en Kotlin?

sobes.tech IA

Réponse de l'IA

this fait référence à l'instance courante de la classe ou au destinataire d'une expression lambda. Il est utilisé pour indiquer explicitement un membre de la classe ou une référence à l'objet actuel lorsqu'il y a ambiguïté (par exemple, lorsqu'une variable locale porte le même nom).

super est utilisé pour appeler des méthodes ou accéder à des propriétés de la classe parente. Il s'applique lorsque vous souhaitez utiliser l'implémentation de la classe parente au lieu de l'implémentation redéfinie dans la classe actuelle.

Exemples :

class MyClass(val value: Int) {
    fun printValue() {
        println(this.value) // Utilisation explicite de this pour accéder à la propriété
    }
}

open class Parent {
    open fun greet() {
        println("Bonjour du parent")
    }
}

class Child : Parent() {
    override fun greet() {
        super.greet() // Appel à la méthode de la classe parente
        println("Bonjour de l'enfant")
    }
}

Lorsqu'utilisé dans des fonctions lambda, this peut faire référence au receveur de la lambda :

fun String.addExclamation(): String {
    return this + "!" // this fait référence à la chaîne receveuse
}

fun main() {
    val numbers = listOf(1, 2, 3)
    val sum = numbers.sum() // sum est une fonction d'extension, this dans la lambda fait référence à la liste numbers
    println(sum)
}

Pour résoudre l'ambiguïté, lorsque vous avez des classes imbriquées ou des lambdas avec des receveurs, vous pouvez utiliser this@ClassName ou this@label :

class A { // étiquette implicite @A
    inner class B { // étiquette implicite @B
        fun Int.foo() { // étiquette implicite @foo
            val a = this@A // référence à l'instance de A
            val b = this@B // référence à l'instance de B
            val c = this // référence à l'instance d'Int, le receveur de la fonction foo
            val c1 = this@foo // référence à l'instance d'Int, le receveur de la fonction foo
        }
    }
}