2011-07-12 6 views
4

私はジェネリックスの1つの側面の周りに私の頭を完全にラップしていません。ジェネリッククラスのすべてのインスタンスを参照するには?

のは、私はジェネリッククラスを持っているとしましょう:

public abstract SomeClass<T> where T : SomeInterface 
{ 
    public bool DoSomethingsWithT(T theItem) 
    { 
     //doStuff!!! 
    } 

    public virtual bool IsActive 
    { 
     get { return true; } 
    } 
} 

だからbasicly私がアクティブになるこのクラスを継承したバージョンを想定したが、私はそれらのいくつかは、独自に定義することができます。今後、私はタイプSomeClass<T>のものであろうが、TはSomeInterface

public bool SomeMethod(object item) 
{ 
    var something = item as SomeClass; 

    return something.IsActive; 
} 

を実装する任意のクラスかもしれない。しかし、もちろん、これはのようにそこに動作しない私が知っているメソッドにオブジェクトを取得しています上の

SomeClassという名前のクラスはありません。私はSomeClass<SomeInterface>もできません。他のクラスがこれを継承しても、私はこれをキャストできません。

これはどのようにして正常に行われますか? SomeClassという名前のクラスを作成すると、SomeClass<SomeInterface>が継承し、そのクラスではIsActiveプロパティを定義します。

私はこの同じ正確な問題を見ています。SomeClass<SomeInterface>を継承するアイテムのコレクションを作成するつもりでした。

答えて

3

は、一般的なクラスに実装するためのインタフェースを使用します。

interface ISomeClass 
{ 
    bool IsActive {get;} 
} 

public abstract SomeClass<T> : ISomeClass where T : SomeInterface 
{ 
    public bool DoSomethingsWithT(T theItem) 
    { 
     //doStuff!!! 
    } 

    public virtual bool IsActive 
    { 
     get { return true; } 
    } 
} 

public bool SomeMethod(object item) 
{ 
    var something = item as ISomeClass; 

    return something.IsActive; 
} 
+0

あなたとダン・タオが言及したように私の前提は正しかった。だから、基本的に私は、インターフェイスに 'T'とは独立した全てのクラスメンバーと、ジェネリックバージョン内の' T'に依存するすべてのクラスメンバーを持たせることができますか? –

0

インタフェースを使用するクラスの実装

public bool SomeMehtod(object item) 
{ 
    return ((SomeInterface)item).IsActive; 
} 

はちょうどそののisActive財産を実現し、あなたが定義されていないインタフェースではありません。

そして、これを行うための最善の方法は、クラスがSomeClassであるかどうかを判断して、共通の動作が含まれているインタフェースを実装/クラスから派生についてIsActive

public bool SomeMethod(object item) 
{ 
    var something = item as SomeClass; 
    if (something != null) 
    { 
     return something.IsActive; 
    } 
    else 
    { 
     return somethingElse; 
    } 
} 
+1

...項目が工ass は、ないSomeInterface –

4

方法を返すことです。

interface IIsActive 
{ 
    bool IsActive{get;} 
} 
+0

。しかし、私は主にジェネリッククラスの参照について一般的に尋ねていました。 –

2

我々は、我々は、D、そのクラスからとでSomeClass<SomeInterface> 継承することをSomeClassという名前のクラスを作成する必要がありますIsActiveプロパティを参照してください。

これはまさにあなたがしなければならないことです(そしてこれが通常どおりに行われる方法です)。

spender's adviceに従うと、抽象クラスの代わりにインターフェイスを使用できます。厳密な型階層に制限することなく同じ目標を達成するので、おそらくこれは優れています。

0

ない私はこの権利を持っている、しかし、のsomeMethodため、このメソッドシグネチャ作業がならば必ず?そのためにupvote、ここで問題を解決するための素晴らしい方法だろう仕事を文句を言わない

public bool SomeMethod(SomeClass<SomeInterface> item) 
    {    
     return item.IsActive; 
    } 
+1

2番目のコードブロックは機能しません:InvalidCastException "'SomeClass'1 [SomeInterface]'を入力するための 'ConcreteType'タイプのオブジェクトをキャストできません。" –

+0

@Jacob:十分な公正 - それを実装しなければ確信が持てませんでした。削除しました。 –

+0

SomeMethodは、プロファイルを制御できない抽象クラスのオーバーライドされたメソッドです。例えばSortingMethodであることができますが、ソートされるコレクションはSomeClass型であることがわかります。 –

関連する問題