2011-07-29 4 views
5

私は動物の色を一度指定したい、それは同じ種のすべての動物で同じです。抽象オブジェクトの値とメソッドをスカラでどのように宣言しますか?

だから私がやりたい:

abstract object Animal {val color: String} 

そして、私はまだすることができない規則を持っているように、これは、オブジェクトにする必要が

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

で個々の動物の色を指定します動物のオブジェクトで宣言されたファクトリメソッドを持つ動物だけを変更し、ファクトリメソッドはその色にアクセスする必要があります。例:

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

「クラスだけが宣言されているが未定義のメンバーがある可能性がある」として、これを実際にスカラーで行う方法を教えてください。

私は形質を使ってこれを行うためのハックな方法を考えることができますが、私はより良いものがあることを望んでいます。

[編集] だから、私は複雑な理由で値や方法を保持するために形質を使うことはできません。 現在のソリューションでは、子オブジェクトを親オブジェクトに静的に登録する方法があります。このメソッドを使用すると、オブジェクトに定義されている非特性値やメソッドにアクセスできます。私はまだもっと良い解決策を望んでいます。

答えて

15

定義により、objectを拡張することはできません。そうです、あなたは形質を必要とするが、私はこのことについてハックは何も表示されません。

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 = ... 
} 
関連する問題