【问题标题】:Scala How can Trait override toString Case Class that is Derived OffScala Trait如何覆盖派生的toString案例类
【发布时间】:2020-02-23 17:09:43
【问题描述】:

我的背景是 C++/C,我正在尝试学习 scala。我正在努力理解特征的 toString 方法如何覆盖从特征派生的案例类。当然,默认案例类的 toString 方法应该覆盖特征的?我遗漏了一些明显的东西?

代码

trait Computer {
  def ram: String
  def hdd: String
  def cpu: String

  override def toString = "RAM= " + ram + ", HDD=" + hdd + ", CPU=" + cpu

}

private case class PC(ram: String, hdd: String, cpu: String) extends Computer 

private case class Server(ram: String, hdd: String, cpu: String) extends Computer

object ComputerFactory {
  def apply(compType: String, ram: String, hdd: String, cpu: String) = compType.toUpperCase match {
    case "PC" => PC(ram, hdd, cpu)
    case "SERVER" => Server(ram, hdd, cpu)
  }
}
val pc = ComputerFactory("pc", "2 GB", "500 GB", "2.4 GHz");
val server = ComputerFactory("server", "16 GB", "1 TB", "2.9 GHz");

println("Factory PC Config::" + pc);
println("Factory Server Config::" + server);

【问题讨论】:

  • 按照马里奥的回答,可能结帐this question
  • 值得一提的是,一般来说,trait 不应该提供toString,除非您完全确定要为每个子类型 (和因此我将其设为final)。 - 另外,很多人会争辩说,你不应该真的在toString 中只为了快速调试,如果你需要将对象转换为字符串,请创建自己的方法。

标签: scala overriding traits tostring case-class


【解决方案1】:

SLS 很清楚这一点

每个案例类都隐式地覆盖了类的一些方法定义 scala.AnyRef 除非已经给出了相同方法的定义 在案例类本身或同一方法的具体定义中 在与AnyRef 不同的案例类的某些基类中给出。 特别是:

方法toString: String返回一个字符串表示,它包含 类及其元素的名称。

因为trait Computer 提供了toString 的具体定义,并且是PCServer 的基类,所以使用Computer.toString

【讨论】:

    猜你喜欢
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多