-1

次のコードを意図したとおりに動作させる方法を教えてください。問題は、私のファクトリが具体的なクラスを返していることを Scala コンパイラが認識しないため、オブジェクトを後で使用できないことです。TypeTags または型パラメーターは役に立ちますか? または、別の方法でコードをリファクタリングする必要がありますか? 私は(明らかに)Scalaが初めてです。

trait Animal
trait DomesticatedAnimal extends Animal
trait Pet extends DomesticatedAnimal {var name: String = _}
class Wolf extends Animal
class Cow extends DomesticatedAnimal
class Dog extends Pet

object Animal {
    def apply(aType: String) = {
        aType match {
            case "wolf" => new Wolf
            case "cow" => new Cow
            case "dog" => new Dog
        }
    }
}

def name(a: Pet, name: String) {
  a.name = name
  println(a +"'s name is: " + a.name)
}                                               

val d = Animal("dog")                                                     
name(d, "fred") 

dコンパイラがAnimalではなく であると考えるため、コードの最後の行は失敗しますDog

4

3 に答える 3

4

特性のinstaed のapply各サブクラスのメソッドを持つコンパニオン オブジェクトを作成する必要があります。また、 で行ったように可変フィールドを使用することは悪い習慣と見なされます。AnimalAnimalname

于 2013-10-28T09:23:22.227 に答える