如何使数据类(Kotlin)从超类扩展并继承超类字段之一?

时间:2019-06-13 21:46:38

标签: kotlin overriding data-class

我尝试为某些数据类创建一个自定义的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中定义的“值”字段和获取方法。我不想介绍一个新的。

我该如何纠正?

3 个答案:

答案 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中的Idopen

MyId是数据类时,这是不合法的,因为其所有构造函数参数都必须为valvar

答案 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
}