Несколько классов с одинаковым поведением в Scala - PullRequest
0 голосов
/ 27 апреля 2020

Я определяю некоторые классы дел на основе Exception с идентичным поведением ( источник )

case class Foo(msg: String) extends Exception {
    override def toString: String = scala.runtime.ScalaRunTime._toString(this)
}
case class Bar(msg: String) extends Exception {
    override def toString: String = scala.runtime.ScalaRunTime._toString(this)
}
case class Boo(msg: String) extends Exception {
    override def toString: String = scala.runtime.ScalaRunTime._toString(this)
}

Все эти новые исключения повторяют один и тот же код. Я хочу избавиться от избыточного дублирования кода. Я безуспешно пытался использовать промежуточный общий базовый класс и черты. Пожалуйста, помогите мне удалить лишнее дублирование кода.

1 Ответ

3 голосов
/ 27 апреля 2020

ScalaRunTime._toString принимает аргумент Product

def _toString(x: Product): String =
  x.productIterator.mkString(x.productPrefix + "(", ",", ")")

, поэтому попробуйте определить

trait ProductException extends Exception with Product {
  override def toString: String = scala.runtime.ScalaRunTime._toString(this)
}

, а затем

case class Foo(msg: String) extends ProductException
Foo("Live long and prosper")
// res1: Foo = Foo(Live long and prosper)

Это работает, потому что классы неявно Product s, например, определение

case class Foo(msg: String)

расширяется компилятором до чего-то вроде

case class Foo(msg: String) extends Object with Product with Serializable
...