2013-10-04 12 views
7

私はジェネリッククラスから派生クラスを作成しようとしている、と私は違いはおそらく以来、何のコードは存在しませんクラスAの内側"クラスA:B <C>"と "クラスA <T>:B <T>のT:C"の違いは何ですか?

public class A<T> : B<T> where T : C 
{ 
} 

public class A: B<C> 
{ 
} 

の間にあるかと思いました。 (今のところ)クラスBとは異なる振舞いはしません。私は2つのクラスを区別したいだけです。

ありがとうございます。

答えて

8

Aはあなたの最初に続いてクラス

public class D : C 
{ 
} 

を持っていたと言う、非ジェネリッククラスAで終わるだろう以下の例は有効です。

var a = new A<D> 

2番目のコードはハードgenric型パラメータに対してBの使用Cを持つようにコード化され、ジェネリックではありません一方であなたは最終的にはC.

から派生しTのための任意のクラスを使用することができます。

2

これはサンプルのため、Constraints with generics in C#です:

public class A<T> : B<T> where T : C 
{ 
} 

では一般的なTCタイプまたはその子(抽象あるもの)でなければなりません。

public class A: B<C> 
{ 
} 

ジェネリックで

Cです。最初のオプションで使用すると、一般的なクラスを持つことになり、一方、第二の選択肢で

2

最初の例では、Aは、タイプCの汎用クラスです。また、タイプCのクラスBから継承します。

あなたの第二の例は、次のプロパティがあります

Aジェネリッククラスではありません。クラスのクラスBを継承しています。

だから実際にはかなり異なっています。

1

最初の例では、A Classを汎用クラスとし、クラスをインスタンス化するときにTを指定する必要があります。2番目の例では

A<C> instance = new A<C>(); 

A Classをインスタンス化する際にそのがA Class宣言に基づいて舞台裏で自動的に行うので、Tを宣言する必要がないので、A Classは、ジェネリッククラスではありません。

A instance = new A(); 

もう一つの違い

あなたは、与えられた階層的な継承ツリーがある場合:最初の例で

enter image description here

、あなたがAクラスをインスタンス化するとき、一人一人が継承をクラスはTとして使用できます。

第二の例では、あなたがAクラスをインスタンス化し、C2クラスを指定することができ、C2から継承するので、唯一のクラスはAクラスinsde使用することができます。

関連する問題