Sobes.tech
Middle

Quali sono le caratteristiche del lavoro con ereditarietà e delega in Kotlin?

sobes.tech AI

Risposta dell'AI

In Kotlin, l'ereditarietà di default è chiusa (final), e le classi e i metodi devono essere esplicitamente contrassegnati come open per consentire ereditarietà e overriding. È supportata l'ereditarietà da una sola classe, ma si possono implementare molteplici interfacce.

Quando si eredita, il costruttore della classe base viene chiamato dopo quello della classe derivata:

open class Base(val name: String) {
    init { println("Inizializzando Base") }
    open fun greeting() { println("Ciao da Base") }
}

class Derived(name: String, val age: Int) : Base(name) {
    init { println("Inizializzando Derived") }
    override fun greeting() { println("Ciao da Derived") }
}

La delega in Kotlin è implementata a livello del linguaggio usando la parola chiave by. Permette di trasferire l'implementazione di un'interfaccia a un altro oggetto. È un'alternativa comoda all'ereditarietà di implementazione (che non è supportata direttamente).

interface Greeter {
    fun greet(name: String)
}

class GreeterImpl : Greeter {
    override fun greet(name: String) {
        println("Ciao, $name!")
    }
}

class DelegateGreeter(greeter: Greeter) : Greeter by greeter

Qui, DelegateGreeter delega la chiamata del metodo greet all'oggetto greeter.

Confronto:

Caratteristica Ereditarietà Delegazione (by)
Relazione "è un" (È) "ha un" (Contiene)
Implementazione Estensione diretta della classe Trasferimento di implementazione a un oggetto
Multipli Una classe base Multiple interfacce
Flessibilità Meno flessibile Più flessibile, tramite composizione
Visibilità Eredita protected e public Funziona tramite interfacce

La delega è spesso preferita all'ereditarietà per raggiungere flessibilità ed evitare problemi di "classe base fragile".