在Scala中,我可以覆盖包含列表的具体字段并在子类中附加一些内容吗?

时间:2010-03-11 09:07:32

标签: scala

这是我所拥有的课程的简化:

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 个答案:

答案 0 :(得分:7)

是的,尚未实现对通过自我类型“继承”的方法的超级调用。这将很快(稍微)改变。在此期间,您应该使用继承。

答案 1 :(得分:4)

有趣的是,我昨天也遇到了同样的问题。

当前实现self类型的方式,如果覆盖方法(或值),则无法引用重写方法。

以下将循环:

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

(注意:您无法拨打super.fooB的父级是ScalaObject,而不是A

我还尝试了一个间接,但程序仍然循环。

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

目前正在进行自我类型的工作,也许这会改变。

答案 2 :(得分:3)

至少在requiredThings中将def作为trait是有道理的 - 这将为您提供更多灵活性