Sobes.tech
Middle

Kokios savybės yra dirbant su paveldėjimu ir delegavimu Kotlin?

sobes.tech AI

Atsakymas iš AI

Kotlin paveldėjimas pagal numatytąją tvarką yra uždaras (final), todėl klases ir metodus reikia aiškiai pažymėti kaip open, kad būtų galima paveldėti ir perrašyti. Palaikomas tik vieno pagrindinio klases paveldėjimas, tačiau galima įgyvendinti daugybę sąsajų.

Paveldėjimo metu pagrindinio klases konstruktorius yra iškviečiamas po paveldėjusio klases konstruktoriaus:

open class Base(val name: String) {
    init { println("Base inicijuojama") }
    open fun greeting() { println("Sveiki iš Base") }
}

class Derived(name: String, val age: Int) : Base(name) {
    init { println("Derived inicijuojama") }
    override fun greeting() { println("Sveiki iš Derived") }
}

Kotlin kalboje delegavimas įgyvendinamas naudojant raktinį žodį by. Tai leidžia perduoti sąsajos įgyvendinimą kitam objektui. Tai patogi alternatyva įgyvendinimui paveldėjimo būdu (kuris tiesiogiai nepalaikomas).

interface Greeter {
    fun greet(name: String)
}

class GreeterImpl : Greeter {
    override fun greet(name: String) {
        println("Sveiki, $name!")
    }
}

class DelegateGreeter(greeter: Greeter) : Greeter by greeter

Čia DelegateGreeter deleguoja greet metodo iškvietimą greeter objektui.

Palyginimas:

Savybė Paveldėjimas Delegavimas (by)
Santykis "is a" (yra) "has a" (turi)
Įgyvendinimas Tiesioginis klasių išplėtimas Įgyvendinimo perdavimas objektui
Daugybė Viena pagrindinė klasė Daugybė sąsajų
Lankstumas Mažiau lankstus Lankstesnis, kompozicija
Matomumas Paveldi protected ir public Dirba per sąsajas

Delegavimas dažnai yra pageidautinas už paveldėjimą, siekiant lankstumo ir išvengti "trapios bazinės klasės" problemų.