我希望能够调用超类的抽象方法,如
trait B { def x: Int }
trait D extends B { def y = super.x }
然而,这不起作用。即使是abstract override
修饰符也无济于事。
是否可以在scala中执行此操作?如果不是,那是什么原因?
我知道当我在特质D中覆盖方法x
时,这是有效的,但是可以从方法y
覆盖吗?
答案 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中的线性化。