Junior
Jak funguje dědičnost v Kotlinu?
sobes.tech AI
Odpověď od AI
Dědičnost v Kotlinu je založena na principu otevřených tříd. Ve výchozím nastavení jsou všechny třídy uzavřené (final) a aby byla třída děditelná, musí být výslovně označena klíčovým slovem open.
Hlavní body:
- Otevřené třídy: Třída rodiče musí být označena jako
open.open class Base { // ... } - Dědičnost: Dědičnost se provádí pomocí dvojtečky (
:), za kterou následuje jméno rodičovské třídy a případně volání jejího konstruktoru.class Derived : Base() { // ... } - Přepsání metod a vlastností: Pro přepsání metod nebo vlastností rodičovské třídy musí být tyto označeny v rodičovské třídě jako
open, a v odvozené třídě je nutné použít klíčové slovooverride.Pokud rodičovská metoda nebo vlastnost nebyly označeny jakoopen class Base { open fun process() { /* ... */ } open val value: Int = 0 } class Derived : Base() { override fun process() { /* ... */ } override val value: Int = 1 }open, nelze je přepsat. - Přístup k členům rodičovské třídy: Přístup k členům rodičovské třídy z odvozené třídy se provádí pomocí klíčového slova
super.class Derived : Base() { override fun process() { super.process() // Volání metody rodičovské třídy // ... } } - Konstruktory: Pokud má rodičovská třída konstruktor s parametry, odvozená třída musí tento konstruktor volat ve své deklaraci.
open class Base(name: String) { // ... } class Derived(name: String, age: Int) : Base(name) { // ... } - Rozhraní: Třída může implementovat více rozhraní, která lze uvést za děděnou třídou oddělená čárkou (pokud je). Rozhraní jsou ve výchozím nastavení "otevřená" pro implementaci.
interface MyInterface { fun doSomething() } class MyClass : Base(), MyInterface { override fun doSomething() { /* ... */ } } - Abstraktní třídy: Abstraktní třídy slouží k definování částečné implementace a obsahují abstraktní metody a vlastnosti (označené
abstract), které musí být implementovány v odvozených třídách. Abstraktní členové nevyžadujíopen. Abstraktní třída také nevyžadujeopenpro dědění.abstract class AbsBase { abstract fun abstractMethod() open fun concreteMethod() { /* ... */ } } class AbsDerived : AbsBase() { override fun abstractMethod() { /* ... */ } }
Celkově Kotlin směřuje k jasnosti, vyžadující použití open pro povolení dědění a přepsání.