【发布时间】:2013-02-14 14:23:38
【问题描述】:
我有一个简单的接口 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(...) 因为它没有添加到元素中。除此之外......这样做闻起来很腥。
任何线索如何以理智的方式重组它?
在 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 也被修改的方式添加到其中。
【问题讨论】:
-
建议 - 使用与 .NET 中所有地方相同的代码约定,即以前缀
I:IElement命名的接口 -
谢谢,我会记住的;我上面的帖子仅用于说明目的。
-
@avanwieringen:是的,但是当你试图说明某些事情时,清楚仍然很重要......
-
你说得对,我已经改了。
标签: c# generics inheritance collections