Sobes.tech
Middle

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