Middle
Czy można tworzyć dziedziców z data class w Kotlin?
sobes.tech AI
Odpowiedź od AI
Nie, nie można tego zrobić bezpośrednio. data class nie może być zadeklarowana jako open, co jest warunkiem koniecznym do dziedziczenia w Kotlinie. Wynika to z faktu, że kompilator generuje specjalne metody (equals(), hashCode(), toString(), copy()) dla data class, a dziedziczenie mogłoby zakłócić ich poprawne działanie.
Jednak można używać interfejsów lub klas abstrakcyjnych jako typów bazowych, od których dziedziczą zarówno zwykłe klasy, jak i inne data class (ale nie bezpośrednio od innego data class).
// Przykład interfejsu
interface BaseInfo {
val id: Int
val name: String
}
// data class implementuje interfejs
data class User(
override val id: Int,
override val name: String,
val age: Int
) : BaseInfo
// Inna data class implementuje ten sam interfejs
data class Product(
override val id: Int,
override val name: String,
val price: Double
) : BaseInfo
// Przykład klasy abstrakcyjnej
abstract class BaseEntity(open val id: Int, open val name: String)
// data class dziedziczy po klasie abstrakcyjnej
data class Order(
override val id: Int,
override val name: String, // Nazwa zamówienia
val totalAmount: Double
) : BaseEntity(id, name)
W ten sposób, choć bezpośrednie dziedziczenie od data class jest zabronione, można osiągnąć podobną strukturę i ponowne użycie logiki poprzez dziedziczenie od interfejsów lub klas abstrakcyjnych.