这是我所拥有的课程的简化:
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
}
答案 0 :(得分:7)
是的,尚未实现对通过自我类型“继承”的方法的超级调用。这将很快(稍微)改变。在此期间,您应该使用继承。
答案 1 :(得分:4)
有趣的是,我昨天也遇到了同样的问题。
当前实现self类型的方式,如果覆盖方法(或值),则无法引用重写方法。
以下将循环:
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" }
目前正在进行自我类型的工作,也许这会改变。
答案 2 :(得分:3)
至少在requiredThings
中将def
作为trait
是有道理的 - 这将为您提供更多灵活性