Scala 为什么方法需要';抽象覆盖';修饰语
错误消息状态: 错误:重写类型=>Unit的trait SomeTrait中的方法someMethod; 方法someMethod需要“抽象重写”修饰符 覆盖定义方法:单位= 为什么Scala编译器限制我重写此方法而不将其标记为抽象 编辑: 我检查了答案,它解释了为什么当我们引用可能还没有实现的Scala 为什么方法需要';抽象覆盖';修饰语,scala,Scala,错误消息状态: 错误:重写类型=>Unit的trait SomeTrait中的方法someMethod; 方法someMethod需要“抽象重写”修饰符 覆盖定义方法:单位= 为什么Scala编译器限制我重写此方法而不将其标记为抽象 编辑: 我检查了答案,它解释了为什么当我们引用可能还没有实现的super时,方法上需要抽象关键字 在我的例子中,我只是试图通过全新的实现覆盖somethod中的somethod,而不是试图调用super.somethod 这个覆盖是否会在运行时破坏某些东西?如果您有
super
时,方法上需要抽象
关键字
在我的例子中,我只是试图通过全新的实现覆盖somethod
中的somethod
,而不是试图调用super.somethod
这个覆盖是否会在运行时破坏某些东西?如果您有
抽象覆盖
,它必须覆盖一个具体的实现才能使整个事情变得具体
这项工作:
trait Base {
def someMethod: Unit
}
trait SomeTrait extends Base {
abstract override def someMethod: Unit = ???
}
class SomeTraitImp extends SomeTrait with Base {
override def someMethod: Unit = ???
}
因为SomeTrait.someMethod
覆盖了Foo
中的具体实现。
这并不是:
trait Foo extends Base { def someMethod: Unit = ??? }
class SomeTraitImp extends Foo with SomeTrait
因为Foo
中的一个具体方法试图覆盖sometratimpl
中的抽象覆盖
您的示例基本上与上一个代码段相同,只是覆盖在类本身中,而不是在Foo
中
回答你的最后一个问题,是的,如果允许的话,它会在运行时中断。考虑这一点:
class SomeTraitImp extends SomeTrait with Foo
如果编译此代码,它将在运行时抛出一个异常,因为Baz
中的super.foo
调用Bar
的foo
,它调用super.foo
,它引用了foo.foo
,这是一个抽象的版本。您能告诉我们您使用的是哪个Scala版本吗,并给出一些显示此错误的真实代码?@Tim scala 2.12.7。这是显示错误的真实代码。问题是为什么没有super
调用的覆盖是不安全的。@Dima,如果Baz中没有super.foo
调用该怎么办。只有def foo=“baz”
?它仍然不安全吗?@Dima还有关于这个类的问题sometratimp用Foo扩展了SomeTrait
。这里我们有SomeTrait
包含抽象实现,它覆盖了Foo
中的具体实现,所以我认为,当我们有具体实现时,我们可以说整个SomeTraitImp
是具体的,因为抽象方法可以在需要时调用非抽象代码。@BogdanVakulenko它实际上并不不安全没有super
调用,但其思想是将一个方法声明为abstract override
,以表示“这个特性必须覆盖一个具体的实现”。就像你不能实例化一个抽象类,即使它没有实际的抽象成员。在类sometratimp用Foo扩展sometracit
,sometracit
不会覆盖Foo
的实现(它从左到右,所以Foo
覆盖sometracit
,反之亦然),SomeTrait
在本例中的super是Base
。
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)