3

Andrew Tolson による Pro C# では、著者は、非ジェネリック クラスがジェネリック基本クラスを拡張する場合、派生クラスは型パラメーターを指定する必要があると述べています。

// Assume you have created a custom
// generic list class.
public class MyList<T>
{
  private List<T> listOfData = new List<T>();
}
// Non-generic classes must specify the type
// parameter when deriving from a
// generic base class.
public class MyStringList : MyList<string>
{}

私が理解していないのは、なぜこれが必要なのですか?

4

5 に答える 5

7

それ以外の場合、CLR はT.

List<T>インスタンス化可能な型にまだ置換されていないため、オープン型です。Tまた、オープン タイプのインスタンスを作成することはできません。型のインスタンスを作成できるのは、その型が閉じているとき、つまり、その型パラメーター (囲んでいる型と基本型を含む) がすべてインスタンス化可能な型に置き換えられているときだけです。

を宣言できる場合、にはその型パラメーターが含まれていないため、class MyTList : MyList<T> { }の型を指定する可能性はありません。したがって、 をインスタンス化することはできません。それはあまり有用なクラスではありません。TMyTListMyTList

于 2013-01-29T13:47:52.660 に答える
5

タイプを指定しない場合、他の唯一のオプションは、派生クラスもジェネリックにすることです。

public class MyDerivedList<T> : MyList<T>
{
}
于 2013-01-29T13:48:17.510 に答える
4

非ジェネリック クラスには型パラメーターがなく、ジェネリック クラスには 1 つ以上の型パラメーターがあります。

型パラメーターを指定せずにジェネリック クラスからクラスを継承する場合、ジェネリック クラスのままです。

public class MyList<T> : List<T> {} //MyList is still generic

しかし

public class MyList : List<T> {} //invalid declaration, what is T ?

それで

public class MyStringList : List<string> {} //specified with string

または、より一般的な

public class MyArrayList : List<object> {} //specified with object

主に私が「アリティ」という言葉を使うのが好きだからです。

CLR のクラスは、0 以上のアリティを持つことができます。つまり、0 以上の型パラメーターを指定できます。ただし、CLR はアリティが 0 以外のクラスをインスタンス化できないため、有用なことを行うには、クラスのアリティを 0 に下げる必要があります。

つまり、次のようなクラスを部分的に指定できます。

public class IntKeyDictionary<TValue> : Dictionary<int, TValue>

アリティを減らしたり、次のようなクラスを宣言したりする

public class ListAndAHalf<TOne, TTwo> : List<TOne>

アリティを上げると、アリティが 0 のクラスでストーリーを終わらせる必要がありList<string>ますDictionary<int, double>

于 2013-01-29T13:47:42.270 に答える
2

そうじゃなかったら?

あなたMyStringListはジェネリックになります( のハードコードされた型がないためT)が、非ジェネリッククラスを構築するため、定義によるものではありません。

于 2013-01-29T13:48:58.303 に答える
2

逆に考えてみてください。基本型の型パラメーターを指定しなかった場合、どの型 MyList<T>使用する必要がありますか? それはまだ定義されていません。

別のジェネリック型から継承するジェネリック型を作成すると、スーパータイプの型パラメーターを指定する必要がなくなります。あなたのクライアントはそれを行うことができます。

于 2013-01-29T13:49:48.760 に答える