Scala наследует параметризованный конструктор - PullRequest
24 голосов
/ 27 июня 2011

У меня есть абстрактный базовый класс с несколькими необязательными параметрами:

abstract case class Hypothesis(
    requirement: Boolean = false,
    onlyDays:   Seq[Int] = Nil,
    …
) extends Something {…}

Действительно ли мне нужно явно повторить все параметры с дополнительными ключевыми словами override val сверху

case class SomeHypothesis(
    anotherArg: SomeType,
    override val requirement: Boolean = false,
    override val onlyDays:   Seq[Int] = Nil,
    …
) extends Hypothesis(
    requirement,
    onlyDays,
    …
) {…}

Или есть такой синтаксис, как

case class SomeHypothesis(anotherArg: SomeType, **) extends Hypothesis(**) {…}

Мне даже не нужен anotherArg, просто способ передать все аргументы ключевых слов в супер-конструктор.


Мне очень нравится идея Scala о конструкторах, но если для этого не будет синтаксиса, я разочаруюсь: (

Ответы [ 4 ]

12 голосов
/ 27 июня 2011

Вы можете просто использовать фиктивное имя в унаследованном классе:

case class SomeHypothesis(anotherArg: SomeType, rq: Boolean = false, odays: Seq[Int] = Nil)
extends Hypothesis(rq, odays)

но вы должны повторить значения по умолчанию. Нет необходимости переопределять val.

EDIT:

Обратите внимание, что ваш абстрактный класс не должен быть классом case. Расширение классов наблюдений теперь устарело . Вместо этого вы должны использовать экстрактор для вашего абстрактного класса:

abstract class SomeHypothesis(val request: Boolean)

object SomeHypothesis {
  def unapply(o: Any): Option[Boolean] = o match {
    case sh: SomeHypothesis => Some(sh.request)
    case _ => None
  }
}
5 голосов
/ 27 июня 2011

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

trait Hypothesis {
  def requirement: Boolean
  def onlyDays: Seq[Int]
  /* other common attributes as necessary */
}

case class SomeHypothesis(anotherArg: SomeType,
                          requirement: Boolean = false,
                          onlyDays: Seq[Int] = Nil)
  extends Hypothesis

Поля класса дел SomeHypothesis будут соответствовать требованиям признака Гипотеза.

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

object Hypothesis {
  def unapply(h: Hypothesis): (Boolean, Seq[Int]) = (h.requirement, h.onlyDays)
}
2 голосов
/ 12 февраля 2015

Я провожу ДНИ, стуча головой по столу, пытаясь понять, почему именованные параметры не входят в расширенный класс.

Я попробовал traits, copy (), как вы его называете - я и компилятор всегда были в ссоре, и когда что-то компилировалось, значения никогда не передавались.

Так, чтобы было ясно, если у вас есть класс

class A(someInt:Int = 0, someString: String ="xyz", someOtherString: String = "zyx")  

И вы хотите его расширить:

class B extends A // does NOT compile 

class B(someInt: Int, someString: String, someOtherString: String) extends A // compiles but does not work as expected 

Вы могли бы подумать, что вызов B таков:

case object X = B(someInt=4, someString="Boo", someOtherString="Who") 

На самом деле либо НЕ скомпилируется (к сожалению, это так), либо фактически работает (это НЕ)

Вместо этого вам нужно создать B следующим образом (да, это повторение вышеуказанного ответа, но сначала это не было очевидно, когда Google привел меня сюда ...)

class B(someInt: Int, someString: String, someOtherString: String) extends A(someInt, someString, someOtherString) 

и сейчас

case object X = B(someInt=4, someString="Boo", someOtherString="Who") 

И СОСТАВЛЯЕТ, И РАБОТАЕТ

Я еще не определил все комбинации и перестановки того, что / когда и где вы можете поместить значения по умолчанию в конструкторе класса B, но я почти уверен, что значения по умолчанию могут быть указаны в определении класса B с "ожидаемым " Результаты.

0 голосов
/ 27 июня 2011

Если гипотеза является абстрактным классом, у меня не было бы конструктора для него.Я бы установил эти параметры как абстрактные атрибуты абстрактного класса.

Но тогда, в этом случае вам нужен модификатор override.

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