[英]Collections and Lists
这是一个非常安全的假设,下面的类是“降级”(缺少更好的词)私人类字段的奇怪表示吗?
public class AggregatedClass : ICollection<SingleClass>
{
List<SingleClass> _singleClassList;
// ...rest of code
}
我最近看到了一个“工作”的例子,它让我有点循环。 以上是什么意思? 如果List<T>
实现了ICollection<T>
,那么上面的类不是一个反转吗? 你有一个私有类字段,其类型类是它的父类实现( ICollection<T>
)的扩展。
是否准确地说上面的例子并不是一个很棒的设计?
我想说这没什么不对。 AggregatedClass
提供了一个ICollection<SingleClass>
的契约,以及如何实现该契约是一个实现细节,没有双关语意图。
如果对于该示例,该类被定义为:
public class AggregatedClass : List<SingleClass>
然后我不得不说是的,有一个设计问题。 建议不要在公共API中公开List<T>
,而是公开Collection<T>
因为集合提供了像InsertItem
和ClearItems
这样的虚拟方法,并且列表对应方没有提供任何稍后可用于覆盖基础中的行为的虚方法类。
但是,如果您不想专门从Collection<T>
继承,那么在您提供的示例中实现ICollection<T>
是另一种合适的替代方法,也允许该类继承自其他基类。
这将List<T>
抽象为实现细节,如果适当/需要,该类现在可以在列表的各种方法中提供额外的逻辑(添加/删除等;注意这些在List-of-T上是非虚拟的) 。
如果你的意思是该字段应该是ICollection - 嗯,这取决于班级! 它可能正在使用额外的List-of-T方法,或者它可能只是一个不相关的实现细节,对于编写该类的人来说很方便,并且因为它是私有的,所以没有任何伤害。
它几乎取决于AggregatedClass在不久的将来会做什么:通过使用私有字段实现ICollection ,设计者可以自由地从另一个派生出AggregatedClass。
由于C#不允许多重继承,因此它是一件珍贵的事情。
在我看来,如果该类“主要”是一个List,我会直接派生它。 在我需要从另一个类继承的情况下,总是可以按照你在问题中显示的方式重构类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.