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- ը ներսում վերաբերում է 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`- ի ստացողին
        }
    }
}