trait Base {
def someMethod: Unit
}
trait SomeTrait extends Base {
abstract override def someMethod: Unit = ???
}
class SomeTraitImp extends SomeTrait with Base {
override def someMethod: Unit = ???
}
错误消息状态:
错误:类型=> Unit的特征SomeTrait中的覆盖方法someMethod; 方法someMethod需要使用“抽象覆盖”修饰符 覆盖def someMethod:单位= ???
为什么Scala编译器会限制我重写此方法而不将其标记为抽象?
修改:
我检查了this的答案,它解释了为什么当我们引用可能尚未实现的abstract
时方法上需要super
关键字。
就我而言,我只是尝试通过全新的实现覆盖someMethod
中的SomeTrait
,而不是尝试调用super.someMethod
。
此覆盖是否可以在运行时破坏某些内容?
答案 0 :(得分:5)
如果您有abstract override
,则它必须重写一个具体的实现,以使整个事情变得具体。
这有效:
trait Foo extends Base { def someMethod: Unit = ??? }
class SomeTraitImp extends Foo with SomeTrait
因为SomeTrait.someMethod
覆盖了Foo
中的具体实现。
这不是:
class SomeTraitImp extends SomeTrait with Foo
因为Foo
中的一种具体方法试图覆盖abstract override
中的SomeTraitImpl
。
您的示例与上一个代码段基本相同,除了您的替代位于类本身而非Foo
中。
回答最后一个问题,是的,如果允许的话,它将在运行时中断。考虑一下:
trait Foo { def foo: String }
trait Bar extends Foo { abstract override def foo = super.foo + "bar" }
class Baz extends Foo with Bar { override def foo = super.foo + "baz" }
println(new Baz().foo)
如果对此进行编译,它将在运行时引发异常,因为super.foo
中的Baz
调用Bar
的{{1}},后者调用foo
,指的是super.foo
,它是抽象的。