Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为什么方法需要';抽象覆盖';修饰语_Scala - Fatal编程技术网

Scala 为什么方法需要';抽象覆盖';修饰语

Scala 为什么方法需要';抽象覆盖';修饰语,scala,Scala,错误消息状态: 错误:重写类型=>Unit的trait SomeTrait中的方法someMethod; 方法someMethod需要“抽象重写”修饰符 覆盖定义方法:单位= 为什么Scala编译器限制我重写此方法而不将其标记为抽象 编辑: 我检查了答案,它解释了为什么当我们引用可能还没有实现的super时,方法上需要抽象关键字 在我的例子中,我只是试图通过全新的实现覆盖somethod中的somethod,而不是试图调用super.somethod 这个覆盖是否会在运行时破坏某些东西?如果您有

错误消息状态:

错误:重写类型=>Unit的trait SomeTrait中的方法someMethod; 方法someMethod需要“抽象重写”修饰符 覆盖定义方法:单位=

为什么Scala编译器限制我重写此方法而不将其标记为抽象

编辑:

我检查了答案,它解释了为什么当我们引用可能还没有实现的
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)