在Scala中调用抽象超级方法

时间:2015-09-22 11:34:49

标签: scala

我希望能够调用超类的抽象方法,如

trait B { def x: Int }
trait D extends B { def y = super.x }

然而,这不起作用。即使是abstract override修饰符也无济于事。

是否可以在scala中执行此操作?如果不是,那是什么原因?

我知道当我在特质D中覆盖方法x时,这是有效的,但是可以从方法y覆盖吗?

2 个答案:

答案 0 :(得分:1)

如果你有像

这样的定义
trait B { def x: Int }

然后方法x没有实现,这就是它不起作用的原因。

trait D extends B { def y = super.x }

你试着在这里调用一些没有实现的东西,但是如果你想引用特定的超类,你可以这样做:

    trait C { def x : Int = 42 }
    trait D extends C { def y : Int = super[C].x }

C现在指定作为调用目标的超类,如果不指定任何内容,则按D的线性化顺序调度该调用。

答案 1 :(得分:1)

你不能调用未实现的方法,但在这种情况下你可以调用x而不用super:

trait B { def x: Int }
trait D extends B { def y = x }

为了解原因,您可以阅读scala中的线性化。