8

基本クラスがジェネリッククラスである派生クラスがいくつかあるとします。各派生クラスは、特定の型オーバーライドを使用して基本クラスを継承します(ただし、すべての型も単一の基本型から派生します)。

例えば:

基本行クラスがあります

class RowBase
{
    //some properties and abstract methods
}

そして、行基本クラスから派生した2つの特定の行クラスがあります

class SpecificRow1 : RowBase
{
    //some extra properties and overrides
}

class SpecificRow2 : RowBase
{
    //some extra properties and overrides
}

次に、RowBaseから派生したクラスのコレクションを含むジェネリッククラスである2番目の基本クラスがあります。

class SomeBase<T> where T : RowBase
{
    ICollection<T> Collection { get; set; }
    //some other properties and abstract methods
}

次に、SomeBaseから派生した2つのクラスがありますが、異なる特定の行クラスを使用しています

class SomeClass1 : SomeBase<SpecificRow1>
{
     //some properties and overrides
}

class SomeClass2 : SomeBase<SpecificRow2>
{
     //some properties and overrides
}

これで、メインスコープまたはより大きなスコープで、SomeClass1オブジェクトとSomeClass2オブジェクトの両方で構成されるリスト/コレクションを作成したいと思います。好き

ICollection<???> CombinedCollection = new ...
CombinedCollection.Add(new SomeClass1())
CombinedCollection.Add(new SomeClass2())
.
.
.
//add more objects and do something about the collection
.
.
.

問題は、そのようなコレクションを持つことは可能ですか?可能であれば、どうすればこれを達成できますか?いいえの場合、別の方法は何でしょうか?

4

1 に答える 1

9

これは、共分散と反分散の助けを借りて行うことができます。

T パラメーターを共変にする新しいインターフェイスを追加します ( outキーワードを使用)。

interface ISomeRow<out T> where T : RowBase
{
}

SomeBase は、次のようにそのインターフェイスを継承する必要があります。

class SomeBase<T> : ISomeRow<T> where T : RowBase
{
    //some other properties and abstract methods
}

次に、次のように動作します。

List<ISomeRow<RowBase>> myList = new List<ISomeRow<RowBase>>();
myList.Add(new SomeClass1());
myList.Add(new SomeClass2());

これがあなたが探しているものであることを願っています:)

于 2012-11-08T09:41:23.430 に答える