trait Base {
def someMethod: Unit
}
trait SomeTrait extends Base {
abstract override def someMethod: Unit = ???
}
class SomeTraitImp extends SomeTrait with Base {
override def someMethod: Unit = ???
}
Run Code Online (Sandbox Code Playgroud)
错误消息状态:
错误:在类型=>单位的特征SomeTrait中覆盖方法someMethod;方法someMethod需要“抽象覆盖”修饰符覆盖def someMethod:单位= ???
为什么Scala编译器会限制我覆盖此方法而不将其标记为抽象?
编辑:
我检查了这个答案,它解释了为什么abstract当我们引用super该方法时可能需要实现的方法上为什么需要关键字。
在我来说,我只是想覆盖someMethod在SomeTrait通过全新的实现,而不是试图打电话super.someMethod。
这种覆盖会在运行时破坏某些东西吗?
如果您有abstract override,它必须重写一个具体的实现,以使整个事情变得具体。
这有效:
trait Foo extends Base { def someMethod: Unit = ??? }
class SomeTraitImp extends Foo with SomeTrait
Run Code Online (Sandbox Code Playgroud)
因为SomeTrait.someMethod覆盖中的具体实现Foo。这不是:
class SomeTraitImp extends SomeTrait with Foo
Run Code Online (Sandbox Code Playgroud)
因为in的具体方法Foo试图覆盖abstract overridein 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)
Run Code Online (Sandbox Code Playgroud)
如果编译,它会在运行时特罗一个例外,因为super.foo在Baz通话Bar的foo,这电话super.foo,这是指Foo.foo,这是抽象的。