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ų.