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