Если каждая реализация должна иметь отдельную, отдельную реализацию, объявите абстрактный член и реализуйте его в дочерних элементах:
abstract trait NamedCaseClass {
def name: String
}
case class OneCase(number : Int) extends NamedCaseClass {
override def name: String = "OneCase"
}
case class OtherCase(truth : Boolean) extends NamedCaseClass {
override def name: String = "OtherCase"
}
Если все реализации могут просто использовать какое-то значение, которое вы можете вычислить при создании, вы можете использовать конструктор абстрактного класса:
abstract class NamedCaseClass(val name: String)
case class OneCase(number : Int) extends NamedCaseClass("OneCase")
case class OtherCase(truth : Boolean) extends NamedCaseClass("OtherCase")
Если у вас есть иерархия sealed
, вы также можете определить ее следующим образом:
sealed trait NamedCaseClass {
def nameOpt: Option[String] = this match {
case OneCase(number) => Some(name.toString)
case OtherCase(_) => None
}
}
case class OneCase(number : Int) extends NamedCaseClass
case class OtherCase(truth : Boolean) extends NamedCaseClass
Какая из них более удобна, во многом зависит от того, есть ли у вас запечатанная иерархия или открытая, если вы можете рассчитать стоимость при создании или это что-то более сложное, что будет лучше работать как метод.