为什么方法需要“抽象覆盖”修饰符

Bog*_*nko 4 scala

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该方法时可能需要实现的方法上为什么需要关键字。

在我来说,我只是想覆盖someMethodSomeTrait通过全新的实现,而不是试图打电话super.someMethod

这种覆盖会在运行时破坏某些东西吗?

Dim*_*ima 6

如果您有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.fooBaz通话Barfoo,这电话super.foo,这是指Foo.foo,这是抽象的。