数据类似乎是Java中老式pojo的替代品。这些类允许继承是可以预料的,但我看不出扩展数据类的方便方法。我需要的是这样的东西:

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

上面的代码失败是因为component1()方法的冲突。只在一个类中留下数据注释也不能完成这项工作。

也许还有另一种扩展数据类的习惯用法?

UPD:我可能只注释子子类,但数据注释只处理构造函数中声明的属性。也就是说,我必须声明所有的父属性是开放的,并重写它们,这是丑陋的:

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()

当前回答

我是怎么做到的。

open class ParentClass {
  var var1 = false
  var var2: String? = null
}

data class ChildClass(
  var var3: Long
) : ParentClass()

它工作得很好。

其他回答

我是怎么做到的。

open class ParentClass {
  var var1 = false
  var var2: String? = null
}

data class ChildClass(
  var var3: Long
) : ParentClass()

它工作得很好。

我发现在DTO中使用继承的最好方法是使用Lombok插件在java中创建数据类。

不要忘记在注释中将lombok.equalsAndHashCode.callSuper设置为true

我想要继承的数据类没有不应该封装在接口中的行为。通过为接口的“普通”实现者提供私有数据类,所有对象都可以获得数据的好处,而UnitVector就像是对V的扩展。

interface Vector {
    companion object {
        fun build(x : Float ...) : Vector = V(x ...)
        private data class V(override val x : Float ...) : Vector
    }
    val x : Float
    //functions, y etc. 
} 
data class UnitVector(override var x : Float ...) : Vector {
    init {
        //special behavior
    } 
}

Kotlin Traits可以提供帮助。

interface IBase {
    val prop:String
}

interface IDerived : IBase {
    val derived_prop:String
}

数据类

data class Base(override val prop:String) : IBase

data class Derived(override val derived_prop:String,
                   private val base:IBase) :  IDerived, IBase by base

示例使用

val b = Base("base")
val d = Derived("derived", b)

print(d.prop) //prints "base", accessing base class property
print(d.derived_prop) //prints "derived"

这种方法也可以用来解决@Parcelize的继承问题

@Parcelize 
data class Base(override val prop:Any) : IBase, Parcelable

@Parcelize // works fine
data class Derived(override val derived_prop:Any,
                   private val base:IBase) : IBase by base, IDerived, Parcelable

可以从非数据类继承数据类。不允许从另一个数据类继承数据类,因为在继承的情况下,无法使编译器生成的数据类方法一致且直观地工作。