在 Kotlin 中将强制数据传递给 super 类

Passing mandatory data to super classes in Kotlin

我在 Kotlin 中创建实体时遇到问题。特别是,它是关于将数据传递给超级 class。在下面找到一个例子。

我有一个名为 Trackable 的抽象超级 class,classes 可以扩展它。它有一个 user 属性 存储创建该特定对象的人。

abstract class Trackable(
  var createdBy: User
) : Persistable() 

一个名为 Contract 的 class 现在将实现 Trackable super class,暂时出现编译时错误:

@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,我仍然缺乏合适和合理的模式来使用。谁能帮我解决这个问题?

Data classes 不能最好地使用继承,使用组合可能更好,但如果你真的想使用继承,那么恕我直言,最好的方法如下:

使用抽象字段声明抽象 class:

abstract class Trackable : Persistable(){
    abstract var createdBy: User

}

扩展摘要 class 并覆盖 属性 内部数据 class:

data class Contract(
        override var createdBy: User,
        var creationDate: LocalDateTime) : Trackable()

这样可以避免重复 属性,同时能够从 parent class 访问 属性 但它实际上是 children 的成员,从我的角度来看,这是最好的解决方案,因为您保留了 data class 的所有优点,但要谨慎对待它,因为它是主观的。