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) |