Android 子类化房间实体
有没有一种方法可以对房间中的实体进行子类化 我有一辆车Android 子类化房间实体,android,kotlin,android-room,Android,Kotlin,Android Room,有没有一种方法可以对房间中的实体进行子类化 我有一辆车实体 @Entity(tableName = "cars") data class Car( @PrimaryKey @ColumnInfo(name = "vin") val vin: String, val manufacturer: String, val model: String, val color: String, val modelYear: In
实体
@Entity(tableName = "cars")
data class Car(
@PrimaryKey @ColumnInfo(name = "vin") val vin: String,
val manufacturer: String,
val model: String,
val color: String,
val modelYear: Int,
val trim: String = ""
) {
override fun toString() = String.format("%s %s %s %s", modelYear, manufacturer, model, trim)
}
但是我想将制造商
、车型
和modelYear
移动到车辆
实体,并使汽车
继承自该实体
我尝试用这些字段创建一个
Vehicle
实体,并使用数据类Car:Vehicle
,但没有编译。错误是此类型为最终类型,不能在kotlin
中继承,默认情况下所有类均为最终类
从
类上的open注释与Java的final相反:it
允许其他人从此类继承<默认情况下,代码>中的所有类
Kotlin是最终版本
,对应于有效的Java,第3版,
第19项:继承或禁止的设计和文件
因此,您需要添加open
关键字,以便使用
open class Vehicle(..){...}
然后
旁注:如果您试图继承
数据
类,那么您就不能在Kotlin中继承数据
类,因为数据类中类似复制
的方法是最终的,不能被子类覆盖(在这种情况下,子类是数据
类,因此它将自动执行此操作)当类层次结构随着不同的数据成员呈指数增长时,很难实现其他方法,如equals
,尽管您可以通过创建非数据父类或抽象类来避免所有这些冲突。我刚在另一篇SO帖子上读到同样的东西。我想我可以使用摘要
,但它没有提供我所希望的好处。为什么会这样设计或仅仅是Kotlin限制?是的,对于抽象来说,它只是一种Is-a
关系,对于数据类继承,一个原因是复制方法重写不可能,另一个原因是相等不可能,请参见示例数据类载体(val模型:String);数据类FutureCar(val发动机:FancyEngine,val车身:BodyBuilderFactory,val车型:String):车辆档案(车型)代码>因此,在这种情况下,很难实现默认情况下与车辆
类的其他子类相等的值,尽管允许重写,但规范设计者认为这可能会破坏拥有数据类的目的,并增加更多含义
data class Car(...): Vehicle(..){}