Sobes.tech
Junior

Jak działają słowa kluczowe 'super' i 'this' w Kotlin?

sobes.tech AI

Odpowiedź od AI

this odnosi się do bieżącego egzemplarza klasy lub odbiorcy wyrażenia lambda. Używa się go do jawnego wskazania członka klasy lub odniesienia do bieżącego obiektu, gdy występuje niejednoznaczność (np. gdy lokalna zmienna ma tę samą nazwę).

super służy do wywoływania metod lub dostępu do właściwości klasy nadrzędnej. Stosuje się go, gdy trzeba użyć implementacji klasy nadrzędnej zamiast nadpisanej implementacji w bieżącej klasie.

Przykłady:

class MyClass(val value: Int) {
    fun printValue() {
        println(this.value) // Jawne użycie this do dostępu do właściwości
    }
}

open class Parent {
    open fun greet() {
        println("Cześć z rodzica")
    }
}

class Child : Parent() {
    override fun greet() {
        super.greet() // Wywołanie metody klasy nadrzędnej
        println("Cześć z dziecka")
    }
}

Przy użyciu w funkcjach lambda, this może odnosić się do odbiorcy lambda:

fun String.addExclamation(): String {
    return this + "!" // this odnosi się do odbiorcy string
}

fun main() {
    val numbers = listOf(1, 2, 3)
    val sum = numbers.sum() // sum to funkcja rozszerzająca, this w środku odnosi się do listy numbers
    println(sum)
}

Aby rozwiązać niejednoznaczność, gdy masz klasy zagnieżdżone lub lambdy z odbiorcami, można użyć kwalifikowanego this (this@ClassName lub this@label):

class A { // niejawna etykieta @A
    inner class B { // niejawna etykieta @B
        fun Int.foo() { // niejawna etykieta @foo
            val a = this@A // odniesienie do instancji A
            val b = this@B // odniesienie do instancji B
            val c = this // odniesienie do instancji Int, odbiorcy funkcji foo
            val c1 = this@foo // odniesienie do instancji Int, odbiorcy funkcji foo
        }
    }
}