2011-07-29 61 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 = ... 
}