2016-10-19 12 views
1

は、私はこのように実装された抽象クラスを持っています。 汎用引数<T>は、IEntityインターフェイスを実装するクラスでなければならないことを理解しています。基本クラスジェネリック引数明確化

"new()"?とは何ですか?特定のクラスの新しいインスタンスである必要がありますか?それの目的は何ですか? 注:<T><U>

ありがとうございます。

+0

ありがとうございました。 –

答えて

1

new()は、型引数が公共パラを持たなければならないことを指定する制約は次のとおりです。何かのようにメータレスコンストラクタ。ジェネリック型の制約の詳細については、MSDNを参照してください。

3

docsから:

「新しい制約は、ジェネリッククラス宣言内の任意の型引数は、公共パラメータなしのコンストラクタを持たなければならない新しい制約を使用するには、型は抽象的ではないことを指定します。」

私は上記の説明が十分だと思うので、これ以上追加する必要はありません。

3

new()new constraintと呼ばれ、type引数にはパブリックのパラメータのないコンストラクタが必要です。

それを使用することの利点は、あなたが明示的に渡されたタイプを知らなくても、クラス内であなたのジェネリック型のインスタンスを作成することができるということです

例:

public PersonEntity : IEntity 
{ 
    // public parameterless constructor 
    public PersonEntity() 
    { 
    } 
} 

public abstract class BaseImplementation<T, U> : IHistory<T> 
    where T : class, IEntity, new() 
    where U : DbContext, new() 
{ 
    public T CreateEntity() 
    { 
     var entity = new T(); 
     // entity will be the type passed to `T` when instantiating `BaseImplementation` 
    } 
} 

その後の使用は次のようになり

public class PersonImpl : BaseImplementation<PersonEntity, DataContext> 
{ 
    public void Method1() 
    { 
     var entity = CreateEntity(); 
     // entity is typeof(PersonEntity); 
    } 
}