Sobes.tech
Middle

È possibile creare erediti da data class in Kotlin?

sobes.tech AI

Risposta dell'AI

No, non è possibile farlo direttamente. data class non può essere dichiarato come open, il che è un requisito per l'ereditarietà in Kotlin. Ciò è dovuto al fatto che il compilatore genera metodi speciali (equals(), hashCode(), toString(), copy()) per data class, e l'ereditarietà potrebbe compromettere il loro corretto funzionamento.

Tuttavia, è possibile utilizzare interfacce o classi astratte come tipi di base, da cui ereditano sia classi normali che altri data class (ma non direttamente da un altro data class).

// Esempio di interfaccia
interface BaseInfo {
    val id: Int
    val name: String
}

// data class implementa l'interfaccia
data class User(
    override val id: Int,
    override val name: String,
    val age: Int
) : BaseInfo

// Un altro data class implementa la stessa interfaccia
data class Product(
    override val id: Int,
    override val name: String,
    val price: Double
) : BaseInfo

// Esempio di classe astratta
abstract class BaseEntity(open val id: Int, open val name: String)

// data class eredita dalla classe astratta
data class Order(
    override val id: Int,
    override val name: String, // Nome dell'ordine
    val totalAmount: Double
) : BaseEntity(id, name)

In questo modo, anche se l'ereditarietà diretta da data class è vietata, si può ottenere una struttura simile e riutilizzo della logica tramite l'ereditarietà di interfacce o classi astratte.