Sobes.tech
Junior

Come funzionano le parole chiave 'super' e 'this' in Kotlin?

sobes.tech AI

Risposta dell'AI

this si riferisce all'istanza corrente della classe o al destinatario di un'espressione lambda. Viene utilizzato per indicare esplicitamente un membro della classe o un riferimento all'oggetto corrente quando c'è ambiguità (ad esempio, quando una variabile locale ha lo stesso nome).

super viene usato per chiamare metodi o accedere a proprietà della classe genitore. Si applica quando si desidera usare l'implementazione della classe genitore invece di quella sovrascritta nella classe corrente.

Esempi:

class MyClass(val value: Int) {
    fun printValue() {
        println(this.value) // Uso esplicito di this per accedere alla proprietà
    }
}

open class Parent {
    open fun greet() {
        println("Ciao dal genitore")
    }
}

class Child : Parent() {
    override fun greet() {
        super.greet() // Chiamata al metodo della classe genitore
        println("Ciao dal figlio")
    }
}

Quando usato in funzioni lambda, this può riferirsi al ricevitore della lambda:

fun String.addExclamation(): String {
    return this + "!" // this si riferisce alla stringa ricevente
}

fun main() {
    val numbers = listOf(1, 2, 3)
    val sum = numbers.sum() // sum è una funzione di estensione, this all'interno si riferisce alla lista numbers
    println(sum)
}

Per risolvere ambiguità, quando si hanno classi annidate o lambda con riceventi, si può usare this@ClassName o this@label:

class A { // etichetta implicita @A
    inner class B { // etichetta implicita @B
        fun Int.foo() { // etichetta implicita @foo
            val a = this@A // riferimento all'istanza di A
            val b = this@B // riferimento all'istanza di B
            val c = this // riferimento all'istanza di Int, ricevente della funzione foo
            val c1 = this@foo // riferimento all'istanza di Int, ricevente della funzione foo
        }
    }
}