3

他の開発者がこの手法を使用していることに気付きましたが、いつも混乱していました。私は今朝調査することに決め、MSDN で次の情報を見つけました ( http://msdn.microsoft.com/en-us/library/d5x73970(v=vs.100).aspxから):

public class GenericList<T> where T : Employee
{
...
}

クラス内の T のすべてのインスタンスを Employee に置き換えるのではなく、なぜこのメソッドを使用するのでしょうか? 私には、これは保守性に勝っているように思えます。異なる継承階層からのクラスを含める手段としてインターフェースに制限することは理解できますが、継承はすでに上記の問題をより明白な方法で解決していますよね?

これは間違いだと考えられますか、それともこのようなコードを「修正」するのは間違いでしょうか?

4

4 に答える 4

7

Employee から派生したものである可能性があるためです。

public class EvilEmployee : Employee {
    public Int32 Evilness { get; set; }
}

できるようになりました...

GenericList<EvilEmployee> list = GetEvilEmployees();
var mostEvilEmployee = list.OrderByDescending(e => e.Evilness).First();

コンパイル時に T = EvilEmployee であり、EvilEmployee には Evilness プロパティがあることがわかっているため、可能です。リストを Employee のリストに強制すると、(OfType を使用しないと) 不可能になります。

于 2012-04-11T08:19:27.947 に答える
5

クラス内の T のすべてのインスタンスを Employee に置き換えるのではなく、なぜこのメソッドを使用するのでしょうか?

有効にする:

class Manager : Employee { ... }

var board = new GenericList<Manager> ();

あなたの名前「GenericList」は、このシナリオでは「EmployeeList」に似ていることに注意してください

異なる継承階層からクラスを含める手段として、インターフェイスに制限することを理解できます

クラス継承とインターフェースには多くの共通点があります。

しかし、継承はすでに上記の問題をより明白な方法で解決していますよね?

はい、でも同じではありません。board.Add(lowlyProgrammer);ここでは失敗しますが、継承では許可されます。

于 2012-04-11T08:17:17.820 に答える
0

Where ステートメントは意図的に追加されています。Employee クラスから派生したクラスがある状況を考えてみてください。ジェネリック クラスを定義しない場合は、派生クラスごとにクラスを定義する必要があります。

たとえば、EmployeeX が Employee を継承し、EmployeeX インスタンスのみを受け入れる List を定義したい場合、一般的なアプローチを使用することで、新しいクラスを定義する必要はありません。

于 2012-04-11T08:20:28.273 に答える
0

ジェネリックを使用すると、キャストしなくてもタイプセーフになります。

あなたが持っている場合

  public class Manager : Employee
  {
     public double CalculateManagerBonus();
  }

できるよ

   GenericList<Manager> managers = ....

   managers[0].CalculateManagerBonus();

あなたが持っている場合

   GenericList<Employee> managers = ....

   // this is a compiler error
   managers[0].CalculateManagerBonus();

  // this is neccessary if there where no generics.
  ((Manager)managers[0]).CalculateManagerBonus();
于 2012-04-11T08:24:53.870 に答える