Sobes.tech
Junior

Как работят ключовите думи 'super' и 'this' в Kotlin?

sobes.tech AI

Отговор от AI

this се отнася за текущия екземпляр на класа или получателя на израза lambda. Използва се за явно указване на член на класа или препратка към текущия обект, когато има неяснота (например, когато има локална променлива със същото име).

super се използва за извикване на методи или достъп до свойства от родителския клас. Приложим е, когато трябва да използвате реализацията на родителския клас вместо презаписаната реализация в текущия клас.

Примери:

class MyClass(val value: Int) {
    fun printValue() {
        println(this.value) // Явно използване на this за достъп до свойството
    }
}

open class Parent {
    open fun greet() {
        println("Здравей от родителя")
    }
}

class Child : Parent() {
    override fun greet() {
        super.greet() // Вика метода на родителския клас
        println("Здравей от детето")
    }
}

Когато се използва в lambda функции, this може да се отнася към получателя на lambda:

fun String.addExclamation(): String {
    return this + "!" // this се отнася към получателя на стринга
}

fun main() {
    val numbers = listOf(1, 2, 3)
    val sum = numbers.sum() // sum е разширена функция, this вътре се отнася към списъка numbers
    println(sum)
}

За разрешаване на неясноти, когато имате вложени класове или lambda с получатели, можете да използвате квалифицирания this (this@ClassName или this@label):

class A { // неявен етикет @A
    inner class B { // неявен етикет @B
        fun Int.foo() { // неявен етикет @foo
            val a = this@A // препратка към екземпляра A
            val b = this@B // препратка към екземпляра B
            val c = this // препратка към екземпляра Int, получател на функцията foo
            val c1 = this@foo // препратка към екземпляра Int, получател на функцията foo
        }
    }
}