Подтвердить что ты не робот

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 разочаровывается: (

4b9b3361

Ответ 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.