この場合のT
の制約は、T
にはAppBase<T>
を実装し、デフォルトのコンストラクタが必要であることを意味します。効果的には、自分自身を型として渡す必要があります。
これは、通常、タイプシステムの回避策として、typeof(T)
を介して基本クラス内の実装タイプへのアクセスを提供する試みとして行われます。例えば、与えられた:AppBaseFoo
の型情報を出力します
var foo = new AppBaseFoo();
foo.Print();
:あなたは、その後のようなコードを書くことができ
public interface IApp {}
public abstract class AppBase<T> : IApp where T : AppBase<T>, new()
{
public void Print()
{
Console.WriteLine(typeof(T).ToString());
}
}
public class AppBaseFoo : AppBase<AppBaseFoo>
{
}
。しかし、これは絶対確実ではありません。たとえば、サブクラス化すると、これを "中断"します。追加:
public class AppBaseBar : AppBaseFoo {}
そして執筆:
var bar = new AppBaseFoo();
bar.Print();
は、印刷する同じAppBaseFoo
情報を原因。
もっと簡単に言えば、「 'T'は抽象的な' AppBase'の具体的な型であることを強制します。 *なぜ*誰かがこれを行うことを含む、本当に良い説明のために+1。 – CodingWithSpike
@Reed Copsey:あなたの答えをありがとう、あなたはコードをとてもうまく説明しましたが、そのようなパターンの使い方についてはまだ混乱していますか? –
@ Abhi.Net本当に、私はそれを避けることをお勧めします。これは通常、基本クラスからサブクラスの型情報にアクセスしようとする試みですが、これは一般的には良い考えではありません。 –