gpt4 book ai didi

scala - 为什么方法需要 'abstract override' 修饰符

转载 作者:行者123 更新时间:2023-12-05 00:10:56 25 4
gpt4 key购买 nike

trait Base {
def someMethod: Unit
}

trait SomeTrait extends Base {
abstract override def someMethod: Unit = ???
}

class SomeTraitImp extends SomeTrait with Base {
override def someMethod: Unit = ???
}

错误消息指出:

Error: overriding method someMethod in trait SomeTrait of type => Unit; method someMethod needs `abstract override' modifiers override def someMethod: Unit = ???



为什么 Scala 编译器会限制我覆盖此方法而不将其标记为抽象?

编辑:

我查了 this回答并解释了原因 abstract当我们引用 super 时,方法上需要的关键字可能还没有实现。

就我而言,我只是想覆盖 someMethodSomeTrait通过全新的实现而不是试图调用 super.someMethod .

此覆盖是否会在运行时破坏某些内容?

最佳答案

如果您有 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 overrideSomeTraitImpl .

您的示例与上一个代码段基本相同,只是您的覆盖是在类本身中而不是在 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.fooBaz电话 Barfoo , 调用 super.foo , 指的是 Foo.foo ,这是抽象的。

关于scala - 为什么方法需要 'abstract override' 修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55646782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com