В Scala я могу переопределить конкретное поле, содержащее список, и добавить что-то к нему в подклассе? - PullRequest
5 голосов
/ 11 марта 2010

Вот упрощение классов, которые у меня есть:

trait RequiredThings {
  val requiredThings: Seq[String]
}

class SimpleCalculator with RequiredThings {
  val requiredThings = List("a", "b")
}

class ComplicatedCalculator extends SimpleCalculator with RequiredThings {
  self: SimpleCalculator =>
  override val requiredThings:List[String] = List("c") ::: self.requiredThings
}

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

Окончательное решение:

trait RequiredThings {
  def requiredThings: Seq[String]
}

class SimpleCalculator with RequiredThings {
  def requiredThings = List("a", "b")
}

class ComplicatedCalculator extends SimpleCalculator with RequiredThings {
  override def requiredThings:List[String] = List("c") ::: super.requiredThings
}

Ответы [ 3 ]

7 голосов
/ 11 марта 2010

Да, супер вызовы методов, "унаследованных" через self-type, еще не реализованы Это изменится (несколько) в ближайшее время. А пока вы должны использовать наследование.

4 голосов
/ 11 марта 2010

Достаточно забавно, я вчера остановился на той же проблеме.

Способ реализации собственных типов в настоящее время, если вы переопределяете метод (или значение), то нет способа обратиться к переопределенному методу.

Будет зациклено следующее:

class A { def foo = "a" }
trait B { self: A => override def foo = self.foo + "b" }

(примечание: вы не можете позвонить super.foo, родитель B равен ScalaObject, а не A)

Я также попытался с еще одним косвенным указанием, но программа по-прежнему зацикливается.

class A { def foo = "a"; def fooA = A.this.foo }
trait B { this: A => override def foo = fooA + "b" }

В настоящее время идет работа над типами самости, возможно, это изменится.

3 голосов
/ 11 марта 2010

Имеет смысл иметь requiredThings как def, по крайней мере, в trait - это даст вам больше гибкости

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