2

誰かが次のクラス宣言を説明できますか? コードのスニペットを理解し、その部分を説明するという課題が与えられました。このクラス宣言については意味がありません。あなたの誰かが助けることができるかどうか見てください。

class AnimalWorld<T> : IAnimalWorld where T : IContinentFactory, new()
{
    private IHerbivore _herbivore;
    private ICarnivore _carnivore;
    private T _factory;

    /// <summary>
    /// Contructor of Animalworld
    /// </summary>
    public AnimalWorld()
    {
        // Create new continent factory
        _factory = new T();

        // Factory creates carnivores and herbivores
        _carnivore = _factory.CreateCarnivore();
        _herbivore = _factory.CreateHerbivore();
    }

    /// <summary>
    /// Runs the foodchain, that is, carnivores are eating herbivores.
    /// </summary>
    public void RunFoodChain()
    {
        _carnivore.Eat(_herbivore);
    }
}
4

4 に答える 4

3

T : IContinentFactory, new()

  1. T は IContinentFactory から継承する必要があります
  2. T にはパラメーターなしのコンストラクターが必要です。

に関する詳細情報new(): http://msdn.microsoft.com/en-us/library/sd2w2ew5.aspx

于 2012-10-05T08:21:03.070 に答える
1

まず第一に、AnimalWorld は (T の) ジェネリック クラスであり、IAnimalWorld インターフェイスを実装する必要があります。

「where」キーワードの後に​​続くのは、T 型に対する制約であり、T は IContintentFactory を実装し、パラメーターを必要としないパブリック コンストラクターを持たなければならないことを示しています。

于 2012-10-05T08:19:11.167 に答える
1

T は IContinentFactory 型である必要があり、空のコンストラクターが必要です。

そのコードの利点は次のとおりです。

  • new(): コンストラクターにアクセスして、クラス内で新しい T をインスタンス化できます。
  • IContinentFactory: T のオブジェクトを使用すると、そのインターフェイスで宣言されたすべての要素にアクセスできます。
于 2012-10-05T08:17:34.277 に答える
0

このクラスは動物の世界を表します。Tこの世界は大陸に分割されています (ジェネリック パラメータで表されます)。

新しい を作成するとき、クラスでは、空のコンストラクター (制約) を持ち、インターフェイス( ) を実装AnimalWorldするクラス (ジェネリック パラメーター) を提供することによって、現在の大陸を指定する必要があります。Tnew()IContinentFactoryIContinentFactory

例を見てみましょう:次のように定義されてAnimalWorld<Europe> = new AnimalWorld<Europe>()いる場合に機能します:Europe

class Europe : IContinentFactory
{
  // Don't forget the new() constructor
  Europe()
  {
     //...//
  }

  // Here IContinentFactory implementation 
  public IHerbivore CreateHerbivore()
  {
    //...//
  }

  // Here IContinentFactory implementation 
  public ICarnivore CreateCarnivore()
  {
    //...//
  }
}

それに加えてAnimalWorld<T>、インターフェースから派生IAnimalWorld

于 2012-10-05T09:04:39.773 に答える