将强制数据传递给Kotlin中的超类

时间:2018-07-28 14:35:47

标签: constructor kotlin superclass

在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

因此,由于UserTrackable中的必填字段,因此我必须将User对象传递给Trackable构造函数。首先想到的是创建一个名为creator的瞬态属性,然后将其传递给Trackable

@Entity
data class Contract(
  @Transient val creator: User,
  var creationDate: LocalDateTime
) : Trackable(creator) 

但是,就域而言,这似乎是一个非常肮脏的解决方案,因为它污染了我的Contract

最近从Kotlin开始,我仍然缺乏适当和合理的模式来使用。有人可以帮我这个忙吗?

1 个答案:

答案 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,但请随心所欲地服用。