URL: http://msdn.microsoft.com/ja-jp/library/sz6zd40f.aspx
// 具象クラス class BaseNode { } // ジェネリッククラス class BaseNodeGeneric<T> { }
(原文)ジェネリック クラスは、具象、クローズ構築、またはオープン構築の各基本クラスから継承できます。
※ジェネリック クラス・・・class Hoge
// ジェネリック クラスは、具象の基本クラスから継承できます。 class NodeConcrete<T> : BaseNode { } // ジェネリック クラスは、クローズ構築の基本クラスから継承できます。 class NodeClosed<T> : BaseNodeGeneric<int> { } //open constructed type // ジェネリック クラスは、オープン構築の基本クラスから継承できます。 class NodeOpen<T> : BaseNodeGeneric<T> { }
(原文)非ジェネリック クラス (つまり具象クラス) は、クローズ構築の基本クラスからは継承できますが、オープン構築のクラスや型パラメーターからは継承できません。
// 非ジェネリック クラス (つまり具象クラス) は、クローズ構築の基本クラスからは”継承できます”。 class Node1 : BaseNodeGeneric<int> { } // 非ジェネリック クラス (つまり具象クラス) は、オープン構築のクラス(BaseNodeGeneric<T>)からは”継承できない”。 // エラー!! // class Node2 : BaseNodeGeneric<T> {} // 非ジェネリック クラス (つまり具象クラス) は、型パラメーター(T {})からは”継承できない”。 // エラー!! // class Node3 : T {}
(原文)実行時に、クライアント コードから基本クラスをインスタンス化するときに必要な型の引数を提示する方法がないためです。
Node1はintなので提示しなくてもわかる。
Node1 hoge = new Node1 ();
Node2はTなので提示の方法が分からない。具象クラスなので<>は使えない。
Node2 hoge = new Node2<?> ();
Node3はTなので提示の方法が分からない。具象クラスなので<>は使えない。
Node3 hoge = new Node3<?> ();