更改子类子集合中泛型集合属性的元素

本文关键字:集合 属性 元素 泛型 子类 子集合 | 更新日期: 2023-09-27 17:59:23

我有一个简单的接口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(...)的事情,因为它没有添加到元素中。除此之外。。。这样做闻起来很臭。

有什么线索可以用理智的方式重组吗?

Jon Skeet回答后编辑

阅读琼斯的评论,我的问题实际上比上面展示的要复杂一些,但我忘记了一些非常重要的信息。

当我有一个实现上述接口的类,并且元素列表填充如下:

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的方式添加到其中。

更改子类子集合中泛型集合属性的元素

听起来ElementContainer接口应该是通用的:

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

然后:

class SpecificElementContainer : ElementContainer<SpecificElement>
{
    List<SpecificElement> Elements { get; private set; }
}
相关文章: