279

データ クラスは、Java の旧式の POJO に取って代わるようです。これらのクラスで継承が可能になることは十分に予想できますが、データ クラスを拡張する便利な方法は見当たりません。私が必要とするのは次のようなものです:

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

上記のコードは、component1()メソッドの衝突のために失敗します。クラスの1つだけに注釈を残し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()
4

11 に答える 11

255

実のところ、データ クラスは継承とあまりうまく機能しません。データクラスの継承を禁止または厳しく制限することを検討しています。たとえば、equals()非抽象クラスの階層に正しく実装する方法がないことが知られています。

したがって、私が提供できるのは、データ クラスで継承を使用しないことです。

于 2014-10-20T13:53:56.240 に答える