Sobes.tech
Junior

Leg uit hoe het sleutelwoord 'super' werkt in de Kotlin-taal.

sobes.tech AI

Antwoord van AI

Het sleutelwoord super wordt gebruikt om toegang te krijgen tot leden (eigenschappen, methoden) van de ouderklasse vanuit de kindklasse.

De belangrijkste gebruikswijzen:

  1. Aanroepen van de constructor van de ouderklasse: Wordt vaak gebruikt in de constructor van de kindklasse om de bijbehorende constructor van de ouder aan te roepen. Dit is verplicht als de ouderklasse een primaire constructor met parameters heeft.

    open class Parent(val name: String)
    
    class Child(name: String) : Parent(name) {
        // De constructor van Child roept de constructor van Parent aan,
        // door de parameter name door te geven.
    }
    
  2. Toegang tot leden van de ouderklasse, overschreven in de kindklasse: Hiermee kan je de implementatie van een methode of eigenschap in de ouderklasse benaderen, zelfs als ze zijn overschreven (met override) in de kindklasse.

    open class Base {
        open fun greet() {
            println("Hello from Base")
        }
    
        open val value: Int = 1
    }
    
    class Derived : Base() {
        override fun greet() {
            super.greet() // Aanroep van greet() uit Base
            println("Hello from Derived")
        }
    
        override val value: Int = 2
            get() {
                println("Toegang tot Derived waarde")
                return super.value + 1 // Toegang tot value uit Base
            }
    }
    
  3. Toegang tot leden van een specifiek supertype (bij meervoudige interface-erfenis): Als een klasse meerdere interfaces implementeert die leden met dezelfde naam hebben, maakt super in combinatie met de naam van de interface tussen hoekige haakjes (super<TypeName>) het mogelijk om duidelijk aan te geven op welk lid van welke interface wordt verwezen.

    interface MyInterface1 {
        fun foo() { println("MyInterface1 foo") }
    }
    
    interface MyInterface2 {
        fun foo() { println("MyInterface2 foo") }
    }
    
    class MyClass : MyInterface1, MyInterface2 {
        override fun foo() {
            super<MyInterface1>.foo() // Aanroep van foo() uit MyInterface1
            super<MyInterface2>.foo() // Aanroep van foo() uit MyInterface2
        }
    }