Welke kenmerken zijn er in het werken met overerving en delegatie in Kotlin?
sobes.tech AI
Antwoord van AI
In Kotlin is de erfenis standaard gesloten (final), en klassen en methoden moeten expliciet worden gemarkeerd als open om erfenis en overschrijving mogelijk te maken. Er is slechts ondersteuning voor erfenis van één klasse, maar meerdere interfaces kunnen worden geïmplementeerd.
Bij erfenis wordt de constructor van de basisklasse aangeroepen na de constructor van de afgeleide klasse:
open class Base(val name: String) {
init { println("Initialiseren van Base") }
open fun greeting() { println("Hallo van Base") }
}
class Derived(name: String, val age: Int) : Base(name) {
init { println("Initialiseren van Derived") }
override fun greeting() { println("Hallo van Derived") }
}
Delegatie in Kotlin wordt op taalniveau geïmplementeerd met het sleutelwoord by. Het stelt je in staat om de implementatie van een interface door te geven aan een ander object. Dit is een handige alternatief voor directe erfenis van implementatie.
interface Greeter {
fun greet(name: String)
}
class GreeterImpl : Greeter {
override fun greet(name: String) {
println("Hallo, $name!")
}
}
class DelegateGreeter(greeter: Greeter) : Greeter by greeter
Hier delegeert DelegateGreeter de aanroep van de methode greet aan het object greeter.
Vergelijking:
| Kenmerk | Erfenis | Delegatie (by) |
|---|---|---|
| Relatie | "is een" (is a) | "heeft een" (has a) |
| Implementatie | Directe uitbreiding van de klasse | Overdracht van implementatie aan een object |
| Meervoudigheid | Eén basisklasse | Meerdere interfaces |
| Flexibiliteit | Minder flexibel | Meer flexibel, via compositie |
| Zichtbaarheid | Erft protected en public | Werkt via interfaces |
Delegatie wordt vaak de voorkeur gegeven boven erfenis om flexibiliteit te bereiken en problemen met "fragiele basisklassen" te vermijden.