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

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

    // ...rest of code
}

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

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

===============>>#1 票数:6

我想说这没什么不对。 AggregatedClass提供了一个ICollection<SingleClass>的契约,以及如何实现该契约是一个实现细节,没有双关语意图。

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

public class AggregatedClass : List<SingleClass>

然后我不得不说是的,有一个设计问题。 建议不要在公共API中公开List<T> ,而是公开Collection<T>因为集合提供了像InsertItemClearItems这样的虚拟方法,并且列表对应方没有提供任何稍后可用于覆盖基础中的行为的虚方法类。

但是,如果您不想专门从Collection<T>继承,那么在您提供的示例中实现ICollection<T>是另一种合适的替代方法,也允许该类继承自其他基类。

===============>>#2 票数:3 已采纳

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

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

===============>>#3 票数:3

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

由于C#不允许多重继承,因此它是一件珍贵的事情。

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

  ask by translate from so

未解决问题?本站智能推荐:

1回复

如何跟踪(列表 )收藏被修改?

我有一个从List(.MyItem)派生的自定义集合。 我想跟踪我的收藏是否被修改,我该怎么做? 我可以通过实现它们的新定义来跟踪添加删除操作等...但我没有看到List中的任何方法让我有机会跟踪是否修改了集合...
3回复

收藏和记忆

我有一个应用程序读取3-4 GB的数据,从每行构建实体,然后将它们存储在列表中。 我遇到的问题是,内存增长疯狂变得像13到15 GB。 为什么存储这些实体会占用大量内存。 所以我构建了一个Tree并做了类似于Huffman Encoding的事情,整体内存大小变成了大约200 -
1回复

铸造收藏

有了这个: 为什么在这里collection2 == null : 其中SourceCollection is ObservableCollection<Widget>
1回复

可靠的收藏应用程序(组装)是否特定?

我找不到任何文档提供的答案。 可靠的集合通过多个云节点共享,并具有名称和持久性。 它们是通过不同的应用程序共享还是特定于应用程序? 例如,两个不同的MVC应用程序对托管在同一帐户中的可靠字典使用相同的名称。 数据会一样吗?
6回复

收藏集是否可能和/或最佳方式? C#.Net 3.5

我已经为仪表板项目创建了一个类,它将保存仪表板上的位置,描述等信息。我目前正在使用一对集合来保存“库”中包含的仪表板项目以及仪表板上显示的那些项目本身。 我被要求制作这个仪表板多标签,我的第一个倾向是为每个标签创建一个新的集合。 为此,我希望某种类型的数组或集合可以添加许多这些仪表板项集合,
4回复

我应该对少于10个项目的收藏使用词典吗,还是有更好的选择?

我有一个对象列表,我需要尽快找到一个对象(通过其name属性)。 我应该使用什么数据结构? 我知道我可以使用字典,但是列表中不会有超过10个项目,如果我没记错的话,如果集合包含10个或更少的项目,则该字典将作为数组实现。 谢谢。
3回复

收藏 - 列表

今天我需要做一些关于收藏的练习。 我的解决方案有3个项目,一个称为“控制台”,另一个称为“实体”,新项目称为“业务”。 我的控制台项目具有Main入口点。 我的实体项目包含本练习的所有类和父类。 我的名为Business的新项目有一个名为Clientadm的类。 Edit1
5回复

列表方法创建

我正在创建这样定义的对象的列表 对于列表中的每个对象,我正在调用方法moveTime,就像这样 是我可以写一些切肉刀的方法,所以我可以打电话 然后它将通过列表执行该方法 我想我想创建一个收集方法? 我猜测肯定有些事情我可以做,但我不知道是什么。 谢谢你的
2回复

从另一个列表中删除列表项

我有一个包含一些元素的列表,我想从另一个列表中删除元素。 如果某个项目的值Contain (而不是)另一个列表中的值,则应删除该项目。 一种方法是执行此操作: 有用... 但是,我有很多列表(> 1百万个),并且由于可以对ToRemove进行排序,因此使用它来加快处理
2回复

创建新列表

创建新列表时,您是指定初始大小还是将其留空? 我知道通过指定初始大小,您可以避免让列表在每次添加x个项目时重新分配基础数组,但您也会在代码中添加详细程度。 最小的性能增益是否值得为代码添加详细程度和复杂性。 当该列表需要一个项目并且您忘记在初始化中添加一个项目时仍然会遇到重新分配的性能开销