我尝试为某些数据类创建一个自定义的toString()方法。但是我只想定义一次toString的替代。
这将是我的超级班:
abstract class Id(val value: String) {
override fun toString(): String {
return value
}
}
现在,我想通过扩展超类ID在某些数据类中使用自定义的toString()方法:
data class MyId(val v: String): Id(v)
但是,这将为MyId中的“ v”引入辅助字段和获取方法,这不是我想要的。使用“值”而不是“ v”给了我一个问题:“值”隐藏了超类型“ Id”的成员。我想重用ID中定义的“值”字段和获取方法。我不想介绍一个新的。
我该如何纠正?
答案 0 :(得分:4)
我不确定您要做什么,但是您可以做到
abstract class Id(open val value: String) {
override fun toString(): String {
return value
}
}
data class MyId(override val value: String): Id(value)
答案 1 :(得分:1)
请注意,对于非data
类,您可以删除val
而不是覆盖它:
class MyId(value: String): Id(value)
这也不需要value
中的Id
为open
。
当MyId
是数据类时,这是不合法的,因为其所有构造函数参数都必须为val
或var
。
答案 2 :(得分:0)
我要解决的问题是通过存在超类来覆盖数据类的toString()方法。
这是不可能的。 Francesc他的解决方案不会覆盖数据类的toString()方法。仍将使用生成的数据类的toString方法。
考虑:
val myId = MyId("a string value")
assertThat(myId.toString()).isEqualTo("MyId\"a string value\")")
assertThat(myId.toString()).isNotEqualTo("a string value")
更改数据类的.toString()
方法的唯一方法是在数据类本身中:
data class MyId(val value: String) {
override fun toString() = value
}