Sobes.tech
Middle

Létrehozhatók-e örökösök a data class-ból Kotlinben?

sobes.tech MI

Válasz az MI-től

Nem, ez közvetlenül nem lehetséges. A data class nem deklarálható open-ként, ami szükséges a Kotlinban az örökléshez. Ez azért van, mert a fordító speciális módszereket (equals(), hashCode(), toString(), copy()) generál a data class-hoz, és az öröklés megzavarhatja azok helyes működését.

Azonban interfészek vagy absztrakt osztályok használhatók alap típusként, melyekből mind normál osztályok, mind más data class-ok (de nem közvetlenül egy másik data class-ból) örökölhetnek.

// Interfész példa
interface BaseInfo {
    val id: Int
    val name: String
}

// data class implementálja az interfészt
data class User(
    override val id: Int,
    override val name: String,
    val age: Int
) : BaseInfo

// Egy másik data class implementálja ugyanazt az interfészt
data class Product(
    override val id: Int,
    override val name: String,
    val price: Double
) : BaseInfo

// Absztrakt osztály példa
abstract class BaseEntity(open val id: Int, open val name: String)

// data class örököl az absztrakt osztálytól
data class Order(
    override val id: Int,
    override val name: String, // Rendelés neve
    val totalAmount: Double
) : BaseEntity(id, name)

Így, bár a közvetlen öröklés a data class-ból tiltott, hasonló szerkezet és logika újrahasznosítás érhető el interfészek vagy absztrakt osztályok öröklésével.