Scala特征层次结构无法编译

时间:2015-05-09 23:46:45

标签: scala inheritance traits

在我学习Scala的过程中,我创建了以下层次结构:

trait Animal {
  val name: String = "Animal"
}

trait HasLegs {
  this: Animal =>
  val numLegs: Int
}

abstract class Terrestrial extends Animal with HasLegs {
  val name: String = "Terrestrial"
}

class Dog(val name: String) extends Terrestrial {
  def numLegs = 4

  override def toString = {
    f"My name is: $name%s. I'm a Dog and I've $numLegs%d legs. I'm from the ${super.name}%s family."
  }
}

然而,编译器抱怨在Dog.toString" super可能不会用于值名称"。我做错了什么?

1 个答案:

答案 0 :(得分:3)

有几个问题,主要源于在超类中使用val,它将其锁定为一个值,而不是可以通过super覆盖和访问的内容。没有指定override

也存在一些问题
trait Animal {
  // in order for super to be called on this it has to be a def
  def name: String = "Animal"
}

trait HasLegs {
  this: Animal =>
  val numLegs: Int
}

abstract class Terrestrial extends Animal with HasLegs {

  // this needs to be an override of Animal.name
  override def name: String = "Terrestrial"
}

class Dog(override val name: String) extends Terrestrial {

  // since the trait specified this as a val, the implementation
  // also needs to be a val
  val numLegs = 4

  override def toString = {
    f"My name is: $name%s. I'm a Dog and I've $numLegs%d legs. I'm from the ${super.name}%s family."
  }
}

我对内联更改发表了评论。

至于super上无法使用val的原因,请参阅SI-899

  

这是预期的行为,它已被更改,以便特征可以覆盖val,使其更加统一。

相关问题