2016-06-15 7 views
2

私は汎用タイプG<T> where T : Aを持っています。Aは抽象クラスです。それぞれのクラスでBAから派生しました。繰り返しコードを書くことなくタイプG<B>のフィールドを持っていますが、それが可能かどうかはわかりません。これを行う1つの方法は、派生クラスにジェネリック型プロパティを設定します。

abstract class A 
{ 
    protected object g; 

    protected abstract void SetG(); 

    public A() 
    { 
     SetG(); 
    } 
} 

class B : A 
{ 
    protected override void SetG() 
    { 
     this.g = new G<B>(); 
    } 

    public B() : base() {} 
} 

だろう。しかし、これは、すべての派生クラスでrepetetiveコードの多くを意味します。これを行うより良い方法はありますか?

答えて

6

あなたが間に余分な抽象クラスを追加することができます。何をやろうとしていることであると私は信じて

public class B : A<B> 
{ 
    public B() : base() { } 
} 
+0

はい、それは確かに私より良い解決策です。ありがとう!他の誰かが何かを考えている場合には、しばらくお待ちください。 – Dunno

+2

これはあなたが探している解決策です。あなたは 'A 'のようなクラスの間に名前を付けることについて考えてみたいかもしれません。このパターンをどこか別の場所で見たい場合は、CollectionsとGenericの実装も見てください。 –

+0

ハ!良い点、@MattRowland!それがどのように私を逃れたかわからない。 :)代わりに、その名前を使用する答えを更新します。ありがとう! – wablab

0

:に...そして、あなたのBの宣言を更新

public abstract class A<T> : A where T : A 
{ 
    protected override void SetG() 
    { 
     this.g = new G<T>(); 
    } 
} 

Covariant Conversion。デリゲートの使用については、MSDN articleを参照してください。 「共変型のパラメータを持つ代理人の使用」の項を参照してください。あなたのAでは

:,デリゲートを作成します。

Func<G<A>> GetG; 

次に、あなたの派生クラスで、タイプ

Func<G<B>> 

ビンゴの関数にこのFUNCポインタを設定!

関連する問題