收藏和列表

10 .net c# collections

这是一个非常安全的假设,下面的类是"降级"(缺少更好的词)私人类字段的奇怪表示吗?

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

    // ...rest of code
}
Run Code Online (Sandbox Code Playgroud)

我最近看到了一个"工作"的例子,它让我有点循环.以上是什么意思?如果List<T>实现ICollection<T>,那么上面的类是不是一个逆转?你有一个私有类字段,类型类是它的父类实现(ICollection<T>)的扩展.

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

Joã*_*elo 6

我想说这没什么不对.在AggregatedClass提供的合同是ICollection<SingleClass>怎么该合同实施是一个实现细节,没有双关语意.

如果对于该示例,该类被定义为:

public class AggregatedClass : List<SingleClass>
Run Code Online (Sandbox Code Playgroud)

然后我不得不说是的,有一个设计问题.建议不要List<T>在公共API中公开,而是公开,Collection<T>因为集合提供了类似InsertItem和的虚拟方法,ClearItems并且列表副本不提供任何稍后可用于覆盖基类行为的虚方法.

但是,如果你不想特别继承,Collection<T>那么ICollection<T>在你提供的示例中实现类似是另一种合适的替代方法,它也允许类从其他基类继承.


Mar*_*ell 3

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

如果您的意思是该字段应该是 ICollection - 好吧,这取决于班级!它可能正在利用额外的 List-of-T 方法,或者它可能只是一个不相关的实现细节,这对于编写该类的人来说很方便,并且不会造成任何损害,因为它是私有的。

  • @Shark 并不是真正的*安全* - 只是...封装。除此之外,呼叫者不太可能需要其他任何东西,所以不要提供它。允许最大程度地灵活地根据需要进行更改。 (2认同)