Scala Как Trait может переопределить класс дел toString, который выводится из - PullRequest
2 голосов
/ 23 февраля 2020

Мой фон на C ++ / C, и я пытаюсь выучить scala. Я изо всех сил пытаюсь понять, как метод toString признака переопределяет класс case, полученный из признака. Конечно, метод toString класса case по умолчанию должен перевесить черту? Я что-то упускаю очевидное?

Код

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);

1 Ответ

2 голосов
/ 23 февраля 2020

SLS ясно по этому вопросу

Каждый класс case неявно переопределяет некоторые определения методов класса scala.AnyRef , если не является определением того же метода уже дано в самом классе case, или конкретное определение того же метода дано в некотором базовом классе класса case , отличном от AnyRef. В частности:

Метод toString: String возвращает строковое представление, которое содержит имя класса и его элементов.

Hece, поскольку trait Computer дает конкретное определение toString и это базовый класс PC и Server, тогда используется Computer.toString.

...