Scala наследовать параметризованный конструктор
У меня есть абстрактный базовый класс с несколькими необязательными параметрами:
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
, просто способ передать все ключевые слова args в супер-конструктор.
Мне очень нравится идея Scala о конструкторах, но если для этого нет синтаксиса, Ill разочаровывается: (
Ответы
Ответ 1
Вы можете просто использовать фиктивное имя в унаследованном классе:
case class SomeHypothesis(anotherArg: SomeType, rq: Boolean = false, odays: Seq[Int] = Nil)
extends Hypothesis(rq, odays)
но вам придется повторять значения по умолчанию. Нет необходимости переопределять val
.
EDIT:
Обратите внимание, что ваш абстрактный класс не должен быть классом case. Расширение классов классов теперь устарело. Вместо этого вы должны использовать extractor:
abstract class SomeHypothesis(val request: Boolean)
object SomeHypothesis {
def unapply(o: Any): Option[Boolean] = o match {
case sh: SomeHypothesis => Some(sh.request)
case _ => None
}
}
Ответ 2
На мой взгляд, политика значений по умолчанию не относится к базовому классу, но должна идти по конкретным классам. Я бы сделал следующее:
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)
}
Ответ 3
Я провел DAYS, разбивая мне голову на столе, пытаясь понять, почему именованные параметры не попадают в расширенный класс.
Я пробовал черты, 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 с "ожидаемым" Результаты.
Ответ 4
Если гипотеза является абстрактным классом, то у меня не будет конструктора. Я бы
задайте эти параметры как абстрактные атрибуты абстрактного класса.
Но тогда в этом случае вам понадобится модификатор override
.