Sobes.tech
Junior

Jak je v Kotlinu organizováno dědičnost a polymorfismus?

sobes.tech AI

Odpověď od AI

V Kotlinu je dědičnost realizována prostřednictvím mechanismu tříd a rozhraní. Třídy mohou dědit pouze od jedné jiné třídy (jednoduchá dědičnost), ale mohou implementovat více rozhraní.

Ve výchozím nastavení jsou všechny třídy v Kotlinu 'final', což znamená, že nemohou být děděny. Aby bylo možné dědění povolit, musí být třída výslovně označena klíčovým slovem open.

Dědičnost tříd:

open class Shape { // Základní třída, označená jako open
    open fun draw() { // Metoda, kterou lze přepsat
        println("Drawing a shape")
    }
}

class Circle : Shape() { // Dědí od Shape
    override fun draw() { // Přepisuje metodu
        println("Drawing a circle")
    }
}

V konstruktoru odvozené třídy je nutné volat konstruktor základní třídy, explicitně nebo implicitně.

Rozhraní:

Rozhraní v Kotlinu jsou podobná rozhraním v Java 8 a mohou obsahovat abstraktní metody i metody s implementací s tělem. Třídy mohou implementovat jedno nebo více rozhraní.

interface Drawable {
    fun draw() // Abstraktní metoda
    fun description() { // Metoda s výchozí implementací
        println("This is a drawable object")
    }
}

class Square : Drawable {
    override fun draw() { // Implementace abstraktní metody
        println("Drawing a square")
    }
    // description() může být přepsáno, ale není to povinné
}

Polymorfismus:

Polymorfismus v Kotlinu je dosažen tím, že lze pracovat s objekty různých tříd přes společný základní typ (třídu nebo rozhraní). To umožňuje volat metody specifické pro konkrétní typ objektu během běhu.

fun render(drawable: Drawable) {
    drawable.draw() // Volání metody draw() podle skutečného typu objektu
    drawable.description()
}

fun main() {
    val circle: Shape = Circle() // Objekt Circle je považován za Shape
    circle.draw() // Volání draw() z Circle díky polymorfismu

    val square: Drawable = Square() // Objekt Square je považován za Drawable
    render(square) // Volání draw() a description() z Square
}

V tomto příkladu render pracuje s jakýmkoli objektem, který implementuje Drawable. Volání drawable.draw() provede implementaci metody draw pro konkrétní typ objektu (Square v tomto případě).

Rozdíl mezi dědičností tříd a implementací rozhraní:

  • Dědičnost třídy: Určuje vztah "je" (is-a). Odvozená třída dědí stav a chování základní třídy.
  • Implementace rozhraní: Určuje "schopnost" nebo "smlouvu". Třída slibuje poskytnout implementaci všech abstraktních metod rozhraní.

Porovnávací tabulka:

Vlastnost Dědičnost třídy Implementace rozhraní
Typ vztahu is-a Schopnost / Smlouva
Mnohost Jednoduchá Mnohonásobná
Stav Dědí stav základní třídy Stav nedědí
Implementace metod Může obsahovat implementaci Může obsahovat výchozí implementaci (od Java 8)