随播对象会覆盖特征的几种方法

时间:2019-03-03 10:11:06

标签: scala

所以。假设我们具有特征 Animal

trait Animal {
  val typeAnimal: String
  val name: String
}

现在我想创建一个类Dog,以扩展此特征。但是我想使用Companion对象将typeAnimal重写为Mammal,而不是在Dog类本身上进行操作。 像

class Dog(override val name: String) extends Animal
object Dog {
  override val typeAnimal = "Mammal"
}

这不起作用。它对我说了一个错误:

  1. Class Dog不实现typeAnimal
  2. 在伴随对象上对typeAnimal的覆盖不会覆盖任何内容

有可能吗? 我要达到的目标有意义吗?

编辑 我认为按照Jorg的评论无法实现我正在尝试的内容。

我想做的是:一个特征定义每个类应实现的static值,例如typeAnimal,并且,因为它属于实现该特征的每个类的所有实例(例如Dog是哺乳动物,所以我看不出为什么typeAnimal应该是实例变量而不是静态变量的任何原因)我想在同伴对象中覆盖

1 个答案:

答案 0 :(得分:5)

如果您希望typeAnimal是“静态”的,则它不应该是特征本身的成员。您可以改为:

trait Animal {
  val name: String
  def companion: AnimalCompanion
  // optional: def typeAnimal = companion.typeAnimal
}

trait AnimalCompanion {
  val typeAnimal: String
}

class Dog(override val name: String) extends Animal {
  override def companion = Dog
}
object Dog extends AnimalCompanion {
  override val typeAnimal = "Mammal"
}

标准库使用collections完成此操作。