2011-07-29 58 views
5

我想指定动物颜色一次,并且对于同一物种的所有动物都是相同的。如何在scala中声明抽象对象的值和方法?

所以我喜欢做的事:

abstract object Animal {val color: String} 

,然后指定的动物个体的颜色与

object Dog extends Animal {val color = "green"} 

这需要在对象,因为我已经有一个公约,不能在Animal对象中也声明了使用工厂方法生成动物的方法,并且工厂方法需要访问该颜色。 例如

abstract object Animal { 
    val color: String 
    def makeAnimal(args): Animal = ... 
} 

我该如何在scala中做到这一点,因为“只有类可以有声明但未定义的成员”?

我可以想到一个哈克的方式来做到这一点使用特质,但我希望有更好的东西。

[编辑] 所以事实证明,我不能使用特征来保存值/方法的复杂原因。 当前的解决方案涉及使用特征向父对象静态注册子对象,并允许我访问必须在对象中定义的非特征值和方法。我仍然希望有更好的解决方案。

回答

15

根据定义,您不能延伸object s。所以,是的,你需要一个特质,但我看不出这事,哈克:

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 = ... 
}