我有一个简单的接口ElementContainer(也是一个元素),它包含一个包含Elements的列表:
interface IElementContainer : IElement
{
List<Element> Elements { get; }
}
现在我有一个实现此接口的类:
class ConcreteContainer : IElementContainer
{
List<IElement> Elements { get; private set; }
}
但是我不希望这个类成为所有Elements的容器,但只是它们的一部分,比如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(...)
因为它没有添加到Elements中。除此之外......这样做有点腥味。
任何线索如何以理智的方式对其进行重组?
在Jon Skeet的回答后编辑
阅读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
也被修改的方式添加到其中。
答案 0 :(得分:1)
听起来你的ElementContainer
界面应该是通用的:
interface ElementContainer<T> : Element where T : Element
{
List<T> Elements { get; }
}
然后:
class SpecificElementContainer : ElementContainer<SpecificElement>
{
List<SpecificElement> Elements { get; private set; }
}