在Kotlin中创建实体时遇到问题。特别是,它是关于将数据传递给超类的。在下面找到一个示例。
我有一个名为Trackable
的抽象超类,该类可以扩展。它具有一个user
属性,用于存储谁创建了该特定对象。
abstract class Trackable(
var createdBy: User
) : Persistable()
名为Contract
的类现在将实现Trackable
超类,并且暂时存在编译时错误:
@Entity
data class Contract(
var creationDate: LocalDateTime
) : Trackable() // compile error, no user passed here
因此,由于User
是Trackable
中的必填字段,因此我必须将User
对象传递给Trackable
构造函数。首先想到的是创建一个名为creator
的瞬态属性,然后将其传递给Trackable
。
@Entity
data class Contract(
@Transient val creator: User,
var creationDate: LocalDateTime
) : Trackable(creator)
但是,就域而言,这似乎是一个非常肮脏的解决方案,因为它污染了我的Contract
。
最近从Kotlin开始,我仍然缺乏适当和合理的模式来使用。有人可以帮我这个忙吗?
答案 0 :(得分:1)
数据类不能最好地用于继承,使用组合可能会更好,但是如果您真的想使用继承,那么恕我直言,做到这一点的最佳方法如下:
使用抽象字段声明抽象类:
print("Foobar is %s%s" %('Foo','bar',))
扩展抽象类并覆盖数据类中的属性:
abstract class Trackable : Persistable(){
abstract var createdBy: User
}
这样一来,您可以避免拥有重复的属性,同时又能够从data class Contract(
override var createdBy: User,
var creationDate: LocalDateTime) : Trackable()
类访问该属性,但实际上它是parent
的成员,从我的角度来看,这是最好的解决方案,因为您保留了以下所有优点children
,但请随心所欲地服用。