我想指定一次动物的颜色,对同一物种的所有动物都是一样的。
所以我想这样做:
abstract object Animal {val color: String}
然后用
指定单个动物的颜色object Dog extends Animal {val color = "green"}
这需要在对象中,因为我已经有了一个不能改变的约定,只能在Animal对象中声明带有工厂方法的动物,并且工厂方法需要访问颜色。 e.g。
abstract object Animal {
val color: String
def makeAnimal(args): Animal = ...
}
如果“只有类可以声明但未定义的成员”,我如何在scala中实际执行此操作?
我可以想到一种使用特征的hacky方法,但我希望有更好的东西。
[编辑] 所以事实证明,由于复杂的原因,我无法使用特征来保存值/方法。 当前解决方案涉及使用特征静态地向父对象注册子对象,这允许我访问必须在对象中定义的非特征值和方法。我仍然希望有更好的解决方案。
答案 0 :(得分:16)
根据定义,您无法扩展object
。所以,是的,你需要一个特质,但我没有看到任何关于这个的hacky:
trait AnimalCompanion {
val color: String
def makeAnimal(args): Animal // if you have same args everywhere
}
object Dog extends AnimalCompanion {
val color = ...
def makeAnimal(args) = ...
}
甚至更好
trait AnimalCompanion[A <: Animal] {
val color: String
def makeAnimal(args): A
}
class Dog extends Animal
object Dog extends AnimalCompanion[Dog] {
val color = ...
def makeAnimal(args): Dog = ...
}