4

Tが特定のメソッドを実装する他のクラスから継承されていることを示します。

public Class A
 {
    public string GetAccessPoint();
    public string GetPriorityMap();
 }

public Class IndexBuilder<T> where T : A
{
   List<string> Go<T>(T obj)
   {
      string aPt=obj.GetAccessPoint();
      string pMap=obj.GetPriorityMap();
   }
}

つまり、Aから継承されていることを示したのに、objのGetAccessPointおよびGetPriorityマップにアクセスできません。

4

4 に答える 4

14

これは、Go メソッドをジェネリックにしたときに T を再定義したためです。T はクラス レベルで定義されているため、Go で再定義する必要はありません。これを試して:

public Class IndexBuilder<T> where T : A
{
   List<string> Go(T obj)
   {
      string aPt=obj.GetAccessPoint();
      string pMap=obj.GetPriorityMap();
   }
}
于 2012-08-03T20:01:22.127 に答える
3

にエクストラを指定し<T>ています。これは、必ずしも から継承するとは限らない別の型にList<string> Go<T>(T obj)再定義します。の再定義を避けるために代わりに使用してください。TAList<string> Go(T obj)T

于 2012-08-03T20:01:58.057 に答える
1

の回答で(正しく)説明されて<T>いるように、問題はメソッドで新しいを定義していることです。

そうは言っても、これがクラス全体であれば、ジェネリック クラスは必要ないかもしれません。以下はうまくいきます:

public Class IndexBuilder
{
   List<string> Go(A obj)
   {
      string aPt=obj.GetAccessPoint();
      string pMap=obj.GetPriorityMap();
      // Create list...
   }
}

のインスタンスをA直接使用しているだけの場合、 にジェネリックは必要ありませんIndexBuilder

于 2012-08-03T20:10:00.730 に答える
0

クラス内の T をGoメソッド内の T でオーバーライドしています。

于 2012-08-03T20:04:51.533 に答える