Middle
Jaké vlastnosti práce s dědičností a delegováním existují v Kotlinu?
sobes.tech AI
Odpověď od AI
V Kotlinu je dědičnost ve výchozím nastavení uzavřená (final), třídy a metody musí být výslovně označeny jako open, aby bylo možné dědit a přepisovat. Dědění je podporováno pouze od jedné třídy, ale lze implementovat více rozhraní.
Při dědění je konstruktor základní třídy volán po konstruktoru odvozené třídy:
open class Base(val name: String) {
init { println("Inicializace Base") }
open fun greeting() { println("Ahoj z Base") }
}
class Derived(name: String, val age: Int) : Base(name) {
init { println("Inicializace Derived") }
override fun greeting() { println("Ahoj z Derived") }
}
Delegace v Kotlinu je implementována na úrovni jazyka pomocí klíčového slova by. Umožňuje předat implementaci rozhraní jinému objektu. Je to pohodlná alternativa k přímé dědičnosti implementace.
interface Greeter {
fun greet(name: String)
}
class GreeterImpl : Greeter {
override fun greet(name: String) {
println("Ahoj, $name!")
}
}
class DelegateGreeter(greeter: Greeter) : Greeter by greeter
Zde DelegateGreeter deleguje volání metody greet na objekt greeter.
Porovnání:
| Funkce | Dědičnost | Delegace (by) |
|---|---|---|
| Vztah | "je to" (is a) | "má" (has a) |
| Implementace | Přímé rozšíření třídy | Přenos implementace na jiný objekt |
| Mnohostnost | Jedna základní třída | Více rozhraní |
| Flexibilita | Méně flexibilní | Flexibilnější, pomocí kompozice |
| Viditelnost | Dědí protected a public | Funguje přes rozhraní |
Delegace je často preferována před dědičností pro dosažení flexibility a vyhnutí se problémům "křehké základní třídy".