Milyen jellemzői vannak az öröklés és delegálás kezelésének Kotlinban?
sobes.tech MI
Válasz az MI-től
Kotlinben az öröklődés alapértelmezés szerint zárt (final), és az osztályokat és metódusokat kifejezetten open-ként kell megjelölni, hogy öröklés és felülírás legyen lehetőség. Csak egy osztályból származhatunk, de több interfészt is megvalósíthatunk.
Öröklés esetén az alap osztály konstruktorát a leszármazott konstruktorát követően hívják meg:
open class Base(val name: String) {
init { println("Base inicializálása") }
open fun greeting() { println("Helló a Base-ből") }
}
class Derived(name: String, val age: Int) : Base(name) {
init { println("Derived inicializálása") }
override fun greeting() { println("Helló a Derived-ből") }
}
A Kotlinban a delegálás a nyelv szintjén valósul meg a by kulcsszóval. Lehetővé teszi egy interfész implementációjának átadását egy másik objektumnak. Ez kényelmes alternatíva a közvetlen örökléshez képest.
interface Greeter {
fun greet(name: String)
}
class GreeterImpl : Greeter {
override fun greet(name: String) {
println("Helló, $name!")
}
}
class DelegateGreeter(greeter: Greeter) : Greeter by greeter
Itt a DelegateGreeter a greet metódus hívását a greeter objektumnak delegálja.
Összehasonlítás:
| Jellemző | Öröklődés | Delegálás (by) |
|---|---|---|
| Kapcsolat | "egy valami" (is a) | "valaminek a része" (has a) |
| Megvalósítás | Közvetlen osztálybővítés | Átadás egy másik objektumnak a megvalósítást |
| Többszörös | Egy alap osztály | Több interfész |
| Rugalmasság | Kevésbé rugalmas | Rugalmasabb, komponálással |
| Láthatóság | protected és public öröklődik | Interfészeken keresztül működik |
A delegálás gyakran előnyösebb az öröklésnél, hogy rugalmasságot érjünk el és elkerüljük a "törékeny alap osztály" problémákat.