0

我有一个简单的接口 ElementContainer (它也是一个元素),其中包含一个包含 Elements 的列表:

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 回答