所以。假设我们具有特征 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"
}
这不起作用。它对我说了一个错误:
有可能吗? 我要达到的目标有意义吗?
编辑 我认为按照Jorg的评论无法实现我正在尝试的内容。
我想做的是:一个特征定义每个类应实现的static
值,例如typeAnimal,并且,因为它属于实现该特征的每个类的所有实例(例如Dog是哺乳动物,所以我看不出为什么typeAnimal应该是实例变量而不是静态变量的任何原因)我想在同伴对象中覆盖
答案 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完成此操作。