Sobes.tech
Junior

Hoe werken de sleutelwoorden 'super' en 'this' in Kotlin?

sobes.tech AI

Antwoord van AI

this verwijst naar het huidige exemplaar van de klasse of de ontvanger van een lambda-uitdrukking. Het wordt gebruikt om expliciet een lid van de klasse of een verwijzing naar het huidige object aan te geven wanneer er ambiguïteit is (bijvoorbeeld wanneer een lokale variabele dezelfde naam heeft).

super wordt gebruikt om methoden aan te roepen of toegang te krijgen tot eigenschappen van de ouderklasse. Het wordt toegepast wanneer je de implementatie van de ouderklasse wilt gebruiken in plaats van de overschreven implementatie in de huidige klasse.

Voorbeelden:

class MyClass(val value: Int) {
    fun printValue() {
        println(this.value) // Expliciete gebruik van this om toegang te krijgen tot de eigenschap
    }
}

open class Parent {
    open fun greet() {
        println("Hallo van de ouder")
    }
}

class Child : Parent() {
    override fun greet() {
        super.greet() // Aanroep van de methode van de ouderklasse
        println("Hallo van het kind")
    }
}

Bij gebruik in lambda-functies kan this verwijzen naar de ontvanger van de lambda:

fun String.addExclamation(): String {
    return this + "!" // this verwijst naar de ontvangende string
}

fun main() {
    val numbers = listOf(1, 2, 3)
    val sum = numbers.sum() // sum is een extension-functie, this binnen verwijst naar de lijst numbers
    println(sum)
}

Om ambiguïteit op te lossen wanneer je geneste klassen of lambdas met ontvangers hebt, kun je gekwalificeerd this gebruiken (this@ClassName of this@label):

class A { // impliciete label @A
    inner class B { // impliciete label @B
        fun Int.foo() { // impliciete label @foo
            val a = this@A // verwijzing naar de instantie van A
            val b = this@B // verwijzing naar de instantie van B
            val c = this // verwijzing naar de instantie van Int, ontvanger van de functie foo
            val c1 = this@foo // verwijzing naar de instantie van Int, ontvanger van de functie foo
        }
    }
}