为什么可以';在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
。