Koje osobine postoje u radu sa nasledjivanjem i delegiranjem u Kotlinu?
sobes.tech АИ
Одговор од АИ
U Kotlinu, nasleđivanje po defaultu je zatvoreno (final), klase i metode moraju biti eksplicitno označene kao open da bi se omogućilo nasleđivanje i prepisivanje. Dozvoljeno je nasleđivanje samo od jedne klase, ali se može implementirati više interfejsa.
Pri nasleđivanju, konstruktor osnovne klase se poziva nakon konstruktor klase izvedene:
open class Base(val name: String) {
init { println("Inicijalizacija Base") }
open fun greeting() { println("Zdravo iz Base") }
}
class Derived(name: String, val age: Int) : Base(name) {
init { println("Inicijalizacija Derived") }
override fun greeting() { println("Zdravo iz Derived") }
}
Delegacija u Kotlinu se implementira na nivou jezika korišćenjem ključne reči by. Omogućava prenos implementacije interfejsa na drugi objekat. Ovo je zgodna alternativa direktnom nasleđivanju implementacije.
interface Greeter {
fun greet(name: String)
}
class GreeterImpl : Greeter {
override fun greet(name: String) {
println("Zdravo, $name!")
}
}
class DelegateGreeter(greeter: Greeter) : Greeter by greeter
Ovde, DelegateGreeter delegira poziv metode greet objektu greeter.
Poređenje:
| Osobina | Nasleđivanje | Delegacija (by) |
|---|---|---|
| Odnos | "je" (is a) | "ima" (has a) |
| Implementacija | Direktno proširenje klase | Prenos implementacije na objekat |
| Mnoštvo | Jedna osnovna klasa | Više interfejsa |
| Fleksibilnost | Manje fleksibilno | Fleksibilnije, putem kompozicije |
| Vidljivost | Nasleđuje protected i public | Funkcioniše putem interfejsa |
Delegacija je često preferirana u odnosu na nasleđivanje za postizanje fleksibilnosti i izbegavanje problema "krhke osnovne klase".