6

私は、動物、猫、犬の3つのクラスを言っています。

// calling code
var x = new Animal("Rex"); // would like this to return a dog type
var x = new Animal("Mittens"); // would like this to return a cat type

if(x.GetType() == typeof(Dog))
{
   x.Bark();
}
else
{
  x.Meow();
}


class Animal
{
   public Animal(string name)
   {
      // check against some list of dog names ... find rex
      // return Animal of type Dog.

      // if not...

      // check against some list of cat names ... find mittens
      // return Animal of type Cat.
   }
}

これはどういうわけか可能ですか?そうでない場合、私にできる同様のことはありますか?

4

4 に答える 4

9

探しているのは、「仮想コンストラクター」(C# では不可能) または Factory パターンのいずれかです。

class Animal
{
   // Factory method
   public static Animal Create(string name)
   {
      Animal animal = null;
      ...  // some logic based on 'name'
          animal = new Zebra();

      return animal;
   }
}

Factory メソッドは、別の (Factory) クラスに配置することもできます。これにより、より良いデカップリングなどが得られます。

于 2013-08-19T13:45:41.597 に答える
5

いいえ。基本的に正しい修正は、正しい型のインスタンスを作成できる静的メソッドを使用することです。

var x = Animal.ForName("Rex");
var x = Animal.ForName("Mittens");

...

public abstract class Animal
{
    public static Animal ForName(string name)
    {
        if (dogNames.Contains(name))
        {
            return new Dog(name);
        }
        else
        {
            return new Cat(name);
        }
    }
}

または、これは型 (またはその他)のインスタンスメソッドである可能性があります。AnimalFactoryこれは、より拡張可能なアプローチです。たとえば、ファクトリはインターフェイスを実装でき、インスタンスの作成に必要なクラスに注入できます。ただし、実際にはコンテキストに依存します-時にはそのアプローチはやり過ぎです。

基本的に、new Foo(...)呼び出しは常に正確 なインスタンスを作成しますFoo。の戻り値の型で宣言された静的メソッドは、Fooと互換性のある任意の型への参照を返すことができFooます。

于 2013-08-19T13:47:42.373 に答える
1

いいえ、あなたが望む方法でそれが可能だとは思いません。

名前に基づいて動物を返すメソッドを持つ静的クラスを作成できます。

static Animal CreateAnimal(string name)
{
    if(catList.Contains(name))
        return new Cat(name");
    else if(dogList.Contains(name))
        return new Dog(name);

    return null;
}
于 2013-08-19T13:50:43.637 に答える