2

これは私が探しているもののタイトルが間違っているかもしれませんが、クラス ファクトリに要約されると思います。

私は3つのクラスを持っています:

   class Horse : Animal
   class Cow :   Animal

私が作成したいのは、疑似コード化された Animal のメソッドで、次のように機能します。

   List<Horse or Cow> (Animal horseOrCow)
   {
      if (horseOrCow is of type Horse)
         return a list of 10 Horse objects; 
      else
         return a list of 10 Cow objects;
   }

もちろん単純化ですが、これを行う方法を理解したら、残りを理解できるはずです.

(編集: タイプミスを修正)。

4

6 に答える 6

2

タイプのジェネリックメソッドを使用できます

List<T> YourMethod<T>(T horseOrCow) where  T : Mamal
{
   // your code
}
于 2012-11-28T09:28:55.113 に答える
2

is-operatorEnumerable.OfType+を使用できますEnumerable.Take:

public List<Animal> getMammals(Mammal horseOrCow)
{
    if (horseOrCow is Horse)
        return allAnimals.OfType<Horse>().Take(10).Cast<Animal>().ToList();
    else if (horseOrCow is Cow)
        return allAnimals.OfType<Cow>().Take(10).Cast<Animal>().ToList();
    else
        throw new ArgumentException("Invalid Mammal", "horseOrCow");
}

List<Animal> allAnimalsどこかにあると仮定します。

編集Mammalまた、Animaland sinceHorseCowある必要がありMammals、それから継承する必要があります。

class Horse : Mammal{ }
class Cow : Mammal { }
class Animal { }
class Mammal : Animal { }
于 2012-11-28T09:31:05.297 に答える
0
public class Animal
{
    public List<Mammal> GetMammalList(Mammal mammal)
    {
        List<Mammal> list = new List<Mammal>();
        if (mammal.GetType() == typeof(Horse))
            for (int x = 0; x < 10; x++)
                list.Add(new Horse());
        else if (mammal.GetType() == typeof(Cow))
            for (int x = 0; x < 10; x++)
                list.Add(new Cow());
        else
            throw new ArgumentOutOfRangeException();

        return list;
    }
}

public class Mammal : Animal { }

public class Horse : Mammal { }

public class Cow : Mammal { }
于 2012-11-28T09:39:49.667 に答える
0

これはあなたのために働くはずです:

abstract class Animal
abstract class Mammal : Animal  
class Horse : Mammal 
class Cow :   Mammal 

List<T> (T mammal) where  T : Mammal  //mammal is cow or horse
{
   if (horseOrCow is Horse)
      return new List<Horse>(); //add the horses to your list 
   else
      return new List<Cow>(); //add the cows to your list
}
于 2012-11-28T09:29:47.447 に答える
-1

を使用した型チェックはお勧めしませんis。むしろdynamic、オブジェクトのランタイム タイプを決定するために使用します。

public void List<T> GetMammals<T>(T mammal) where  T : Mammal
{
   GetMammalsSpecialization(mammal as dynamic);
}

private void List<Horse> GetMammalsSpecialization(Horse horse)
{
    // Specialized code to return list of horses
}

private void List<Cow> GetMammalsSpecialization(Cow cow)
{
    // Specialized code to return list of cows
}

これは、二重ディスパッチの問題に対するより良い解決策です。

于 2012-11-28T09:39:39.807 に答える
-2
public class Animal
{ 
   public enum AnimalType
   {
     CowType,
     HorseType
   }


   ....
   public Animal Create(AnimalType type)
   {
     Animal result = null;
      switch (type)
      {
       case HorseType: result = new Horse();
       case CowType : ....   
      }
     return result;
   }
}
于 2012-11-28T09:36:21.737 に答える