【问题标题】:How to extend a data class with toString如何使用 toString 扩展数据类
【发布时间】:2016-03-13 13:41:15
【问题描述】:

我已经创建了一个数据类

data class Something (
    val a : String,
    val b : Object,
    val c : String
)

在我的程序后面,我需要这个数据类的字符串表示,我试图扩展toString 方法。

override fun Something.toString() : String = a + b.result() + c

这里的问题是,它不允许扩展(覆盖)toString 函数,因为它不适用于顶级函数。

如何正确覆盖/扩展自定义数据类的 toString 方法?

【问题讨论】:

  • Kotlin 默认也有很好的 toString() 实现,它打印数据类的所有成员。所以在大多数情况下,它足以用于调试等。

标签: kotlin kotlin-extension data-class


【解决方案1】:

在 Kotlin 中,扩展函数不能覆盖成员函数,此外,they are resolved statically。这意味着如果您编写扩展函数fun Something.toString() = ...s.toString() 将不会被解析为它,因为成员总是获胜

但就您而言,没有什么能阻止您在 Something 类主体中覆盖 toString,因为 data 类可以像常规类一样拥有主体:

data class Something(
    val a: String,
    val b: Any,
    val c: String
) {
    override fun toString(): String = a + b + c
}

【讨论】:

  • 可以使用this作为toStringbody中的当前类实例
  • 是否有可能自动生成字符串?这个解决方案有效,但如果你在课堂上有很多礼仪,那么写起来真的很长。
  • 如果你想要一个包含所有属性的字符串(例如用于调试),这是数据类默认自动生成的。如果你不喜欢默认的输出格式,你只需要手动编写这个函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
相关资源
最近更新 更多