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".