次のようなクラス階層を考えてみましょう。基本的には、すべてのクラスに共通のフィールドを持つ抽象的なComplexBase
があります。そして、他のものの間で、またComplexBase
由来ComplexElement
のコレクションを保持し、ComplexBase
由来ComplexClass
あります。抽象クラスの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
両方のインスタンスのコレクションを定義する方法です。非作業バージョンはComplexClass
がジェネリック型で定義されているので、これはコンパイルされません。もちろん、
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);
}
}
のように見えるかもしれません。
私previous attemptは、リストを隠すという概念を使用していたが、それは、これは私がTheBigCollection
のリストから取得ComplexClassA
またはComplexClassB
のインスタンスにComplexElements
のリストにアクセスするから私を妨げていることが判明しました。
私は以前の投稿から、共分散が問題を解決できることを知ったが、IEnumerable
(これは不変である)を使用してTheBigCollection
のクラスリストの新しい要素を追加する方法を理解できない。
を使用すると、中間クラスComplexClassBaseを作成することを検討しましたか? – michauzo
は@michauzoはい、私は非常に[このポスト](http://www.gamedev.net/topic/660308-list-of-generic-objects/)への回答のラインで、やりました。この解決策で発生する問題は、 'Classes'リストを繰り返し処理することができず、例えば各項目の' Elements.Count'プロパティに、適切なキャストなしでアクセスすることができないことです。 – Informagic
中間クラス(またはインターフェイス)にプロパティを配置することができます。SortedList要素{get;セット; }次に、特殊タイプを使用してComplexClassで実装します。 –
michauzo