Middle
Lze v Kotlinu vytvářet potomky z data class?
sobes.tech AI
Odpověď od AI
Ne, to není možné přímo. data class nem může být deklarována jako open, což je podmínka pro dědičnost v Kotlinu. To je způsobeno tím, že kompilátor generuje speciální metody (equals(), hashCode(), toString(), copy()) pro data class, a dědičnost by mohla narušit jejich správnou funkci.
Nicméně, lze použít rozhraní nebo abstraktní třídy jako základní typ, od kterého dědí jak běžné třídy, tak jiné data class (ale ne přímo od jiného data class).
// Příklad rozhraní
interface BaseInfo {
val id: Int
val name: String
}
// data class implementuje rozhraní
data class User(
override val id: Int,
override val name: String,
val age: Int
) : BaseInfo
// Jiná data class implementuje stejné rozhraní
data class Product(
override val id: Int,
override val name: String,
val price: Double
) : BaseInfo
// Příklad abstraktní třídy
abstract class BaseEntity(open val id: Int, open val name: String)
// data class dědí od abstraktní třídy
data class Order(
override val id: Int,
override val name: String, // Název objednávky
val totalAmount: Double
) : BaseEntity(id, name)
Tímto způsobem, i když je přímé dědění od data class zakázáno, lze dosáhnout podobné struktury a opětovného použití logiky prostřednictvím dědění od rozhraní nebo abstraktních tříd.