2016-03-29 4 views
8

は、私は別のプログラマによって書かれた、このコードを持っていると私はタイプTAppBaseクラスがインタフェース​​T実装を実装私の理解から、周りこのSelf参照継承コードではどうなりますか?

public abstract class AppBase<T> : IApp where T : AppBase<T>, new() 
{ 
    // 
} 

を私の頭を取得カント?

最後の部分を説明できる人はいますか?

答えて

7

この場合の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情報を原因。

+0

もっと簡単に言えば、「 'T'は抽象的な' AppBase'の具体的な型であることを強制します。 *なぜ*誰かがこれを行うことを含む、本当に良い説明のために+1。 – CodingWithSpike

+0

@Reed Copsey:あなたの答えをありがとう、あなたはコードをとてもうまく説明しましたが、そのようなパターンの使い方についてはまだ混乱していますか? –

+0

@ Abhi.Net本当に、私はそれを避けることをお勧めします。これは通常、基本クラスからサブクラスの型情報にアクセスしようとする試みですが、これは一般的には良い考えではありません。 –

関連する問題