考慮如下所示的類層次結構。實質上,有一個抽象的ComplexBase
,其中有一些對所有類都通用的字段。然後從ComplexBase
導出ComplexClass
,除此之外,持有也來自ComplexBase
的ComplexElement
的集合。抽象類的在C#中使用列表成員的類的協變性
public abstract class ComplexBase {
internal abstract string Identifier { get; }
}
public abstract class ComplexClass<T> : ComplexBase where T : ComplexElement {
internal SortedList<string, T> Elements { get; set; }
}
public abstract class ComplexElement : ComplexBase { }
實現是ComplexClassA
和ComplexClassB
。前者的ComplexElement
集合僅包含ComplexElementA
的實例,而後者僅包含ComplexElementB
的實例。
public class ComplexClassA : ComplexClass<ComplexElementA> {
public ComplexClassA() {
Elements = new SortedList<string, ComplexElementA>();
}
}
public class ComplexElementA : ComplexElement { }
public class ComplexClassB : ComplexClass<ComplexElementB> {
public ComplexClassB() {
Elements = new SortedList<string, ComplexElementB>();
}
}
public class ComplexElementB : ComplexElement { }
什麼,我努力理解是如何定義一個新的類TheBigCollection
舉辦各種字段和方法,以及雙方ComplexClassA
和ComplexClassB
的實例的集合。非工作版本可能看起來像
public class TheBigCollection {
internal SortedList<string, ComplexClass> Classes { get; set; }
public TheBigCollection() {
Classes = new SortedList<string, ComplexClass>();
}
public void Add(string name, ComplexClass element) {
Classes.Add(name, element);
}
}
當然,這不會編譯因爲ComplexClass
與泛型類型定義。
我previous attempt是使用隱藏列表的概念,但事實證明,這使我訪問中,我從TheBigCollection
列表檢索ComplexClassA
或ComplexClassB
實例ComplexElements
名單。
我從我以前的帖子中瞭解到協變可以解決問題,但我不明白如何使用IEnumerable
- 這是不可變的 - 可以用來添加新元素到TheBigCollection
的類列表。
您是否考慮創建一箇中間類ComplexClassBase:ComplexBase並從ComplexClassBase繼承ComplexClass? –
michauzo
@michauzo是的,我做了,非常符合[本文]的答案(http://www.gamedev.net/topic/660308-list-of-generic-objects/)。這個解決方案出現的問題是,我無法遍歷列表'Classes'並訪問,例如,每個項目的'Elements.Count'屬性不再適當的強制轉換。 – Informagic
在中間類(或接口)中,你可以把屬性SortedList Elements {get;組; },然後使用專用類型在ComplexClass中實現它。 –
michauzo