为什么不能在scala中用抽象的成员覆盖具体成员?

时间:2016-10-21 09:00:54

标签: scala oop override

例如,在以下代码中:

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的Trait Deri中的值a是抽象的,并且是   因此被具体方法a覆盖了特征基数类型=>   动物)

我想知道,因为我已使用a明确修改了Deri中的override,而Scala则选择反过来(覆盖a { {1}}中的Deri中的错误消息,如错误信息中所示)?

1 个答案:

答案 0 :(得分:2)

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

  

这个定义也决定了最重要的关系   匹配C类及其父母的成员。 首先,具体   定义始终覆盖抽象定义。其次,for   定义M和M'都是具体的或两者都是抽象的,M   如果M出现在前面的类中(在...中),则覆盖M'   线性化C)定义M'的类。

因此,要使其编译,您必须确保抽象方法可以被具体的方法覆盖。改变Deri:

trait Deri extends Base { override def a:Animal }

或更改Base

trait Base { val a: Dog = new Dog }