Scala: Классы дел с общим параметром? - PullRequest
0 голосов
/ 28 апреля 2020

Я не знаю, есть ли способ сделать это, но я хочу иметь возможность указать, что все наборы классов делят один и тот же параметр (поэтому я могу получить к нему доступ без сопоставления с образцом).

РЕДАКТИРОВАТЬ: После некоторой помощи у меня есть

abstract class Test(val termName : String)
case class TestOne(value : Int, name : String = null) extends Test(name)
case class TesTwo(otherValue : Boolean, name : String = null) extends Test(name)

Это почти то, что я хочу, хотя было бы неплохо избавиться от уродства иметь и name и termName.

Ответы [ 2 ]

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

хотя было бы неплохо избавиться от уродства, связанного и с именем, и с именем termName.

Просто сделайте его нормальным членом супертипа (который легко может быть trait), а не параметр конструктора:

trait Test { 
  val name : String 
}
case class TestOne(value : Int, name : String = null) extends Test
case class TestTwo(otherValue : Boolean, name : String = null) extends Test

(Стандартный стиль Scala - name: String, пробела до :.)

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

Если каждая реализация должна иметь отдельную, отдельную реализацию, объявите абстрактный член и реализуйте его в дочерних элементах:

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

Какая из них более удобна, во многом зависит от того, есть ли у вас запечатанная иерархия или открытая, если вы можете рассчитать стоимость при создании или это что-то более сложное, что будет лучше работать как метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...