Sobes.tech
Junior

Чӣ тавр кор мекунанд калимаҳои калидии 'super' ва 'this' дар Kotlin?

sobes.tech AI

Ҷавоб аз AI

this ишора қўйилган синф ёки lambda ифода қабул қилувчисининг ҳозирги нусхасига ишора қилади. Бу синфнинг аъзосини ёки ҳозирги объектга ишора қилиш учун ишлатилади, айниқса, номлар бир хил бўлганда (масалан, маҳаллий ўзгарувчи ҳам шу номда бўлганда) аниқлик киритиш учун.

super ота-она синфининг методларини чақириш ёки хусусиятларига кириш учун ишлатилади. Ҳозирги синфда қайта ёзилган амалга ошириш ўрнига ота-она синфининг амалга оширишини ишлатиш керак бўлганда қўлланилади.

misollar:

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 қабул қилувчига ишора қилиши мумкин:

fun String.addExclamation(): String {
    return this + "!" // this қабул қилувчи stringга ишора қилади
}

fun main() {
    val numbers = listOf(1, 2, 3)
    val sum = numbers.sum() // sum кенгайтирилган функция, this ичида listга ишора қилади
    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` функциясининг қабул қилувчисига
        }
    }
}