Sobes.tech
Middle

Je možné v Kotlin vytvárať dedičov z data class?

sobes.tech AI

Odpoveď od AI

Nie, to nie je možné priamo. data class nemôže byť deklarovaná ako open, čo je podmienka pre dedenie v Kotlin. To je spôsobené tým, že kompilátor generuje špeciálne metódy (equals(), hashCode(), toString(), copy()) pre data class, a dedenie by mohlo narušiť ich správnu funkciu.

Avšak, je možné použiť rozhrania alebo abstraktné triedy ako základný typ, od ktorého dedičia ako bežné triedy, tak aj iné data class (ale nie priamo od iného data class).

// Príklad rozhrania
interface BaseInfo {
    val id: Int
    val name: String
}

// data class implementuje rozhranie
data class User(
    override val id: Int,
    override val name: String,
    val age: Int
) : BaseInfo

// Iná data class implementuje to isté rozhranie
data class Product(
    override val id: Int,
    override val name: String,
    val price: Double
) : BaseInfo

// Príklad abstraktnej triedy
abstract class BaseEntity(open val id: Int, open val name: String)

// data class dedí od abstraktnej triedy
data class Order(
    override val id: Int,
    override val name: String, // Názov objednávky
    val totalAmount: Double
) : BaseEntity(id, name)

Týmto spôsobom, aj keď je priame dedenie od data class zakázané, je možné dosiahnuť podobnú štruktúru a opätovné použitie logiky prostredníctvom dedenia od rozhraní alebo abstraktných tried.