要素を含むリストを保持する単純なインターフェイスElementContainer(これも要素です)があります。
interface IElementContainer : IElement
{
List<Element> Elements { get; }
}
これで、このインターフェイスを実装するクラスができました。
class ConcreteContainer : IElementContainer
{
List<IElement> Elements { get; private set; }
}
しかし、クラスをすべての要素のコンテナにするのではなく、それらのサブセット(SpecificElementなど)のみにする必要がありますが、これは(もちろん)不可能です。
class SpecificElementContainer : IElementContainer
{
List<SpecificElement> Elements { get; private set; }
}
したがって、私は次のようなことを考えました:
class SpecificElementContainer : IElementContainer
{
List<IElement> Elements { get; private set; }
List<SpecificElement> SpecificElements
{
get
{
return return Elements.FindAll(el => el is T).Select<IElement, T>(el => (T)el).ToList<T>();
}
}
しかし、この方法では、次のようなことはできませんSpecificContainer.SpecificElements.Add(...)
。要素に追加されていないためです。それに加えて...このようにするのは魚臭い匂いがします。
これを適切な方法で再構築する方法の手がかりはありますか?
ジョンスキートの答えの後に編集
Jonsのコメントを読んで、私の問題は実際には上に示したよりも少し複雑ですが、いくつかの非常に重要な情報を忘れてしまいました。
上記のインターフェースを実装するクラスがあり、要素リストが次のように入力されている場合:
Elements = { ConcreteElementA, ConcreteElementA, ConcreteElementC, ConcreteElementB }
私が望んでいるのは、これを実行できることですConcreteContainer.ConcreteElementCs.Add(new ConcreteElementC())
。
Elements = { ConcreteElementA, ConcreteElementA, ConcreteElementC, ConcreteElementB, ConcreteElementC }
追加編集
少し混乱した後、質問を次のように言い換えたいと思います。コレクションがありますList<Element> OriginalCollection
。Element、ConcreteElementを実装する要素を使用してサブセットコレクションを作成し、これも変更さList<ConcreteElement> Subset
れるように追加したいと思います。OriginalCollection