0

要素を含むリストを保持する単純なインターフェイス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

4

1 に答える 1

1

あなたのElementContainerインターフェースは一般的であるべきだと思われます:

interface ElementContainer<T> : Element where T : Element
{
    List<T> Elements { get; }
}

それで:

class SpecificElementContainer : ElementContainer<SpecificElement>
{
    List<SpecificElement> Elements { get; private set; }
}
于 2013-02-14T14:25:36.330 に答える