1. ホーム
  2. 遺産相続

[解決済み】Kotlinでデータクラスを拡張する

2022-04-02 10:59:38

質問

データクラスは、Javaの昔ながらのPOJOに代わるもののようです。これらのクラスが継承を可能にすることは非常に予想されますが、私はデータクラスを拡張する便利な方法を見いだすことができません。私が必要としているのは、このようなものです。

open data class Resource (var id: Long = 0, var location: String = "")
data class Book (var isbn: String) : Resource()

上記のコードは component1() メソッドを使用します。離脱 data のアノテーションを片方のクラスだけに記述しても、うまくいきません。

データクラスを拡張する別のイディオムがあるのでは?

UPD: 子の子クラスだけにアノテーションを付けることもありますが data アノテーションは、コンストラクタで宣言されたプロパティのみを扱います。つまり、親のプロパティをすべて宣言しなければなりません。 open をオーバーライドすると、醜くなります。

open class Resource (open var id: Long = 0, open var location: String = "")
data class Book (
    override var id: Long = 0,
    override var location: String = "",
    var isbn: String
) : Resource()

解決方法は?

実は、データクラスは継承とあまり相性がよくありません。データクラスの継承を禁止するか、厳しく制限することを検討しています。例えば、データクラスで実装できないことが知られている equals() 非抽象クラスで階層化した場合、正しく表示されます。

つまり、データクラスで継承を使わないでくださいということです。