如何让数据 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
中的 value
为 open
。
当 MyId
是一个数据 class 时,这是不合法的,因为它的所有构造函数参数都必须是 val
或 var
.
我想在我的问题中做的是通过 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
}
我尝试为我的一些数据 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
中的 value
为 open
。
当 MyId
是一个数据 class 时,这是不合法的,因为它的所有构造函数参数都必须是 val
或 var
.
我想在我的问题中做的是通过 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
}