如何让数据类(Kotlin)从超类扩展并继承其中一个超类字段?

如何让数据类(Kotlin)从超类扩展并继承其中一个超类字段?,kotlin,overriding,data-class,Kotlin,Overriding,Data Class,我尝试为一些数据类创建一个自定义toString()方法。但是我只想定义一次对funtostring的覆盖 这将是我的超级课堂: abstract class Id(val value: String) { override fun toString(): String { return value } } 现在,我想通过扩展超类Id在一些数据类中使用定制的toString()方法: data class MyId(val v: String): Id(v) 然而,

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

这将是我的超级课堂:

abstract class Id(val value: String) {
   override fun toString(): String {
       return value
   }
}
现在,我想通过扩展超类Id在一些数据类中使用定制的toString()方法:

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)

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

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

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

请注意,对于非
数据
类,您只需删除
val
,而不是覆盖它:

class MyId(value: String): Id(value)
这也不要求
Id
中的
value
处于
打开状态


MyId
是一个数据类时,这是不合法的,因为它的所有构造函数参数必须是
val
var

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

class MyId(value: String): Id(value)
这也不要求
Id
中的
value
处于
打开状态


MyId
是一个数据类时,这是不合法的,因为它的所有构造函数参数必须是
val
var

在我的问题中,我想做的是通过退出一个超类来重写数据类的toString()方法

这是不可能的。Francesc他的解决方案不会覆盖dataclass的toString()方法。仍将使用dataclass生成的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
}

在我的问题中,我想做的是通过存在一个超类来重写数据类的toString()方法

这是不可能的。Francesc他的解决方案不会覆盖dataclass的toString()方法。仍将使用dataclass生成的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
}

多谢各位。这里的关键是打开超类中的值。你看,我对Kotlin很陌生,我还没有在子类中显式地打开所需的类成员的反射。(在java中,类成员在默认情况下是打开的。)然后,我还被语法弄糊涂了,语法同时定义了两个类成员(value+getter),并定义了一个构造函数参数+我需要打开它的事实在问题中这没有帮助:数据类本身引入了一个toString()实现,重写超类中的一个。在本例中,(MyId(“avalue”).toString()将导致字符串“MyId(“avalue”)而不是“avalue”,谢谢。这里的关键是打开超类中的值。你看,我对Kotlin很陌生,我还没有在子类中显式地打开所需的类成员的反射。(在java中,类成员在默认情况下是打开的。)然后,我还被语法弄糊涂了,语法同时定义了两个类成员(value+getter),并定义了一个构造函数参数+我需要打开它的事实在问题中这没有帮助:数据类本身引入了一个toString()实现,重写超类中的一个。在本例中,(MyId(“avalue”).toString()将导致字符串“MyId(“avalue”)而不是“avalue”