Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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_Oop_Overriding - Fatal编程技术网

为什么可以';在scala中,混凝土构件不能被抽象构件覆盖吗?

为什么可以';在scala中,混凝土构件不能被抽象构件覆盖吗?,scala,oop,overriding,Scala,Oop,Overriding,例如,在以下代码中: class Animal class Dog extends Animal trait Base { def a: Animal = new Dog } trait Deri extends Base { override val a: Dog } 给出了以下错误: 错误:重写Dog类型的trait Deri中的值a;中的方法a 类型=>动物的特征基需要是一个稳定的、不可变的值; (请注意,Dog类型的特征Deri中的值a是抽象的,是 因此,在类型=> (动物)

例如,在以下代码中:

class Animal
class Dog extends Animal
trait Base {
  def a: Animal = new Dog
}
trait Deri extends Base {
  override val a: Dog
}
给出了以下错误:

错误:重写Dog类型的trait Deri中的值a;中的方法a 类型=>动物的特征基需要是一个稳定的、不可变的值; (请注意,Dog类型的特征Deri中的值a是抽象的,是 因此,在类型=> (动物)

我想知道,既然我在
Deri
中用
override
显式修改了
a
,Scala是否选择了另一种方式(用
Deri
中的
a
替换
Base
中的,如错误消息所示)?

根据,具体定义总是覆盖抽象定义

此定义还确定了 匹配C类及其父类的成员首先是混凝土 定义总是覆盖抽象定义。其次,例如 既具体又抽象的定义M和M′,M 如果M出现在前面的类中(在 C)定义了M′的类的线性化

因此,要编译它,必须确保抽象方法可以被具体方法重写。更改日期:

trait Deri extends Base { override def a:Animal }
还是换基地

trait Base { val a: Dog = new Dog }

我不太明白你的问题
Deri
试图覆盖
Base
,但失败了,因为
Base
已经提供了一个基本实现,而
Deri
试图再次将其抽象化。@YuvalItzchakov是的,但在
Deri
中,a的类型是
Dog
,而不是
Animal