2012-11-07 92 views
4

說我有幾個基類是泛型類的派生類。每個派生類都使用特定的類型覆蓋繼承基類(但所有類型也都是從單個基類型派生的)。具有泛型基類的派生類的集合

例如:

我有一個基行類

class RowBase 
{ 
    //some properties and abstract methods 
} 

我有個從行基類派生

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

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

然後兩個特定行類我有一個第二個基類,它是一個泛型類,它包含RowBase派生類的集合

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

然後,我有從SomeBase派生,但我主要還是更大範圍使用不同的特定行類

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 
. 
. 
. 

問題是:有可能有這樣的收藏?如果有可能,我該如何做到這一點?如果不是,可以採用哪種替代方法?

回答

5

這可以在Covariance and Contravariance的幫助下完成。

添加一個新的接口,使T參數協變(使用關鍵字):

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()); 

Hope th是你在找什麼:)

+0

啊,接口!這就是我想念的。謝謝! – noddy

+1

這可能已經超出我的問題,但如果我有方法具有泛型類型T的參數,我想在循環myList集合時調用它。在這種情況下,我不能聲明T型協變。那是否意味着我根本無法做到這一點? – noddy