C# 集合和列表

C# 集合和列表,c#,.net,collections,C#,.net,Collections,下面的类是“降级”(因为没有更好的词)私有类字段的奇怪表示,这是一个相当安全的假设吗 public class AggregatedClass : ICollection<SingleClass> { List<SingleClass> _singleClassList; // ...rest of code } 公共类AggregatedClass:ICollection { 列表_singleClassList; //…代码的其余部分 } 我最近

下面的类是“降级”(因为没有更好的词)私有类字段的奇怪表示,这是一个相当安全的假设吗

public class AggregatedClass : ICollection<SingleClass>
{
    List<SingleClass> _singleClassList;

    // ...rest of code
}
公共类AggregatedClass:ICollection
{
列表_singleClassList;
//…代码的其余部分
}
我最近看到了一个“有效”的例子,这让我有点不知所措。以上的要点是什么?如果
List
实现了
ICollection
,那么上面的a类不是反转吗?您有一个私有类字段,其类型class是其父类实现的扩展(
ICollection


说上面的例子不是一个很好的设计是否准确?

这将
列表抽象为一个实现细节,如果适当/需要,该类现在可以在列表的各种方法中提供额外的逻辑(添加/删除等;注意,这些在List-of-T中是非虚拟的)

如果你的意思是字段应该是ICollection,那么这取决于类!它可能使用了额外的List-of-T方法,也可能只是一个无关的实现细节,这对于编写类的人来说非常方便,因为它是私有的,所以不会造成伤害。

这几乎取决于AggregatedClass在不久的将来将做什么:通过使用私有字段实现ICollection,设计者可以自由地使AggregatedClass派生自另一个字段

因为C#不允许多重继承,所以它是一件珍贵的东西


在我看来,如果类“主要”是一个列表,我会直接派生它。在我需要从另一个类继承的情况下,总是可以按照您在问题中所示的方式重构类。

我想说这没有什么错。
AggregatedClass
提供了一个合同,它是
ICollection
,该合同是如何实现的是一个实现细节,没有双关语

如果在本例中,类的定义如下:

public class AggregatedClass : List<SingleClass>
公共类聚合类:列表
然后我不得不说,是的,这是一个设计问题。建议不要在公共API中公开
List
,而是公开
Collection
,因为Collection提供了类似
InsertItem
ClearItems
的虚拟方法,而List对应方不提供任何可以稍后用于重写基类中行为的虚拟方法


但是,如果您不想专门从
集合继承
,那么像您提供的示例中那样实现
ICollection
是另一个合适的替代方案,它也允许类从其他基类继承。

那么,您仍然需要一个数据结构来保存数据,对吗?无论是列表、数组、ICollection还是其他什么。列表恰好使实现ICollection变得非常容易。@hawkke“列表恰好使实现ICollection变得非常容易。”你这么说仅仅是因为
List
实际上实现了ICollection吗?它是多余的吗?当然有一点。您可以提出一个论点,即singleClassList可以是一个公共属性。但是这样做会暴露整个列表,这可能并不可取。因此,您的基本意思是,实现
ICollection
的类可能需要使用
list
成员,但是公开地说,
AggregatedClass
的实例不应该能够使用
列表
成员?@Shark调用方不应该关心它在内部使用什么,只要它符合公布的合同…对,所以基本上这是一种安全形式(或者…更重要的是一种限制),不公开
列表
成员,并且只公开
ICollection
成员(至少)?@Shark不是真正的安全性-只是。。。封装。打电话的人不太可能需要其他东西,所以不要提供。允许最大限度的灵活性根据需要进行更改。