Sobes.tech
Junior

Kako funkcionišu ključne reči 'super' i 'this' u Kotlinu?

sobes.tech АИ

Одговор од АИ

this se odnosi na trenutni primer klase ili primaoca lambda izraza. Koristi se za eksplicitno označavanje člana klase ili referencu na trenutni objekat kada postoji dvosmislenost (na primer, kada lokalna promenljiva ima isto ime).

super se koristi za pozivanje metoda ili pristupanje svojstvima roditeljske klase. Primjenjuje se kada je potrebno koristiti implementaciju roditeljske klase umesto prepisane implementacije u trenutnoj klasi.

Primeri:

class MyClass(val value: Int) {
    fun printValue() {
        println(this.value) // Eksplicitno korišćenje this za pristup svojstvu
    }
}

open class Parent {
    open fun greet() {
        println("Pozdrav od roditelja")
    }
}

class Child : Parent() {
    override fun greet() {
        super.greet() // Poziv metode roditeljske klase
        println("Pozdrav od deteta")
    }
}

Kada se koristi u lambda funkcijama, this može da se odnosi na primaoca lambda:

fun String.addExclamation(): String {
    return this + "!" // this se odnosi na primaoca string
}

fun main() {
    val numbers = listOf(1, 2, 3)
    val sum = numbers.sum() // sum je funkcija proširenja, this unutar se odnosi na listu numbers
    println(sum)
}

Za razrešenje dvosmislenosti, kada imate ugnježdene klase ili lambde sa primaocima, možete koristiti kvalifikovani this (this@ClassName ili this@label):

class A { // implicitna oznaka @A
    inner class B { // implicitna oznaka @B
        fun Int.foo() { // implicitna oznaka @foo
            val a = this@A // referenca na instancu A
            val b = this@B // referenca na instancu B
            val c = this // referenca na instancu Int, primaoca funkcije foo
            val c1 = this@foo // referenca na instancu Int, primaoca funkcije foo
        }
    }
}