伙伴对象会覆盖特征的几种方法

Tiz*_*ica 1 scala

所以。假设我们有一个特质 Animal

trait Animal {
  val typeAnimal: String
  val name: String
}
Run Code Online (Sandbox Code Playgroud)

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

class Dog(override val name: String) extends Animal
object Dog {
  override val typeAnimal = "Mammal"
}
Run Code Online (Sandbox Code Playgroud)

这行不通。它对我说了一个错误:

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

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

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

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

Ale*_*nov 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"
}
Run Code Online (Sandbox Code Playgroud)

标准库通过collection来做到这一点。