Sobes.tech
Junior

Spiega come funziona la parola chiave 'super' nel linguaggio Kotlin.

sobes.tech AI

Risposta dell'AI

La parola chiave super viene utilizzata per accedere ai membri (proprietà, metodi) della classe genitore dalla classe figlia.

Le principali modalità di utilizzo:

  1. Chiamata al costruttore della classe genitore: Spesso usata nel costruttore della classe figlia per chiamare il costruttore corrispondente del genitore. Questo è obbligatorio se la classe genitore ha un costruttore primario con parametri.

    open class Parent(val name: String)
    
    class Child(name: String) : Parent(name) {
        // Il costruttore di Child chiama quello di Parent,
        // passando il parametro name.
    }
    
  2. Accesso ai membri della classe genitore, ridichiarati nella classe figlia: Permette di accedere all’implementazione di un metodo o proprietà nella classe genitore, anche se sono stati ridichiarati (con override) nella classe figlia.

    open class Base {
        open fun greet() {
            println("Hello from Base")
        }
    
        open val value: Int = 1
    }
    
    class Derived : Base() {
        override fun greet() {
            super.greet() // Chiamata a greet() da Base
            println("Hello from Derived")
        }
    
        override val value: Int = 2
            get() {
                println("Accesso al valore di Derived")
                return super.value + 1 // Accesso a value da Base
            }
    }
    
  3. Accesso ai membri di un tipo superiore specifico (nel caso di ereditarietà multipla di interfacce): Se una classe implementa più interfacce che hanno membri con nomi uguali, super insieme alla specifica del nome dell’interfaccia tra parentesi angolari (super<TypeName>) permette di indicare in modo univoco a quale membro di quale interfaccia si riferisce.

    interface MyInterface1 {
        fun foo() { println("MyInterface1 foo") }
    }
    
    interface MyInterface2 {
        fun foo() { println("MyInterface2 foo") }
    }
    
    class MyClass : MyInterface1, MyInterface2 {
        override fun foo() {
            super<MyInterface1>.foo() // Chiamata a foo() di MyInterface1
            super<MyInterface2>.foo() // Chiamata a foo() di MyInterface2
        }
    }