如何让数据 class (Kotlin) 从 superclass 扩展并继承 superclass 字段之一?

How to have a data class (Kotlin) extend from a superclass and inherit one of the superclass fields?

我尝试为我的一些数据 classes 创建自定义 toString() 方法。但是我只想定义一次 fun toString 的覆盖。

这将是我的超级 class:

abstract class Id(val value: String) {
   override fun toString(): String {
       return value
   }
}

现在我想在我的一些数据中使用自定义的 toString() 方法 classes 通过扩展 superclass Id:

data class MyId(val v: String): Id(v)

然而,这会在 MyId 中为 "v" 引入一个辅助字段和 getter,这不是我想要的。使用 "value" 而不是 "v" 给我一个问题:'value' 隐藏了超类型 'Id' 的成员。我想重用在 Id 中定义的 "value" 字段和 getter。不想介绍新的了

我该如何纠正?

我不太确定你想做什么,但你可以这样做

abstract class Id(open val value: String) {
    override fun toString(): String {
        return value
    }
}

data class MyId(override val value: String): Id(value)

请注意,对于非 data classes,您可以删除 val 而不是覆盖它:

class MyId(value: String): Id(value)

这也不要求 Id 中的 valueopen

MyId 是一个数据 class 时,这是不合法的,因为它的所有构造函数参数都必须是 valvar.

我想在我的问题中做的是通过 exsting superclass.

覆盖数据 class 的 toString() 方法

这是不可能的。 Francesc 他的解决方案不会覆盖 dataclass 的 toString() 方法。数据生成的 toString 方法class 仍将被使用。

考虑:

  val myId = MyId("a string value")
  assertThat(myId.toString()).isEqualTo("MyId\"a string value\")")
  assertThat(myId.toString()).isNotEqualTo("a string value")

改变数据 class 的 .toString() 方法的唯一方法是数据 class 本身:

data class MyId(val value: String) {
  override fun toString() = value
}