【问题标题】:Should we use ICollection<T> in the Interface and Collection<T> in the class?我们应该在接口中使用 ICollection<T> 并在类中使用 Collection<T> 吗?
【发布时间】:2012-08-08 02:15:03
【问题描述】:

我有一个接口和一个实现它的类。现在我想在这个类中收集一些东西。 我应该在它的 interface 部分使用 ICollection 并在具体的 class 部分使用 Collection 吗?

在这两个部分中使用 ICollection 是否更好、更灵活?

另外:我说的“东西”我想在我的类中保留它们的集合,它们也是我拥有的其他一些类的对象,这些类也有自己的接口。那么最好的做法是什么?当我想将它们保存在集合中时,我什至应该使用这些类的接口类型吗?

【问题讨论】:

  • 我会将其初始化为 ICollection&lt;Foo&gt; bar = new List&lt;Foo&gt;(); ... 之类的东西,然后从那里(课堂内外)使用 ICollection&lt;Foo&gt;。希望我正确理解了这个问题。请注意,ICollection&lt;Foo&gt; 对于您的需求可能过于原始,因此IList&lt;Foo&gt; 会更好地工作。这是我最终做过一次的事情——从ICollection 切换到IList,因为我需要有顺序,而不是使用像一组一般的东西。
  • 是的,你理解正确..就我问题的第二部分:你推荐 ICollection 还是使用 ICollection ... Foo 类的接口
  • 尽量保持实际。如果您确实计划更改实现 IFoo 的行为并替换为不同的东西,那么是的,您确实需要 IFoo(我希望 C# 足够聪明,能够识别等价;我还没有尝试过) .如果您不需要更改Foo 的实现,那么可能没有充分的理由创建IFoo。使用ICollection&lt;Foo&gt; 更有意义 - 您希望能够使用不同的数据结构,比如您是否突然需要更好的性能。你可以用说 dequee 代替 List 并且仍然很好
  • 嗯,订购?等一下!所以如果我稍后对它们执行 ForEach 循环,我添加到 Collection 的东西不会显示在已添加到集合中的 smae 订单上?我们可能有某种 OrderredCollection 吗?
  • 是的,有msdn.microsoft.com/en-us/library/ee211538.aspx。你必须问问自己你真正的需求是什么。我意识到我开始竭尽全力支持ICollection,但后来意识到我需要的只是支持一个数组和一个列表95%。另外 5% 的时间我可以打电话给.ToList().ToArray();我负担得起这样做的费用。这与 C# 最酷的功能之一:params T[] 配合得很好。我从来没有最终需要OrderedSet,但只有你最清楚你的问题(将)需要什么。

标签: c# collections


【解决方案1】:

如果你可以暴露一个接口而不是一个类,那么就暴露这个接口;仅在必须这样做时才公开类,例如,公开接口上不可用的方法。你应该在你的界面和课堂上都这样做。

理由是信息隐藏是一件“好事”,所以如果你能做到不失一般性,你应该这样做。

【讨论】:

  • 谢谢,所以在@Lenoids 示例中,您推荐 ICollection 还是推荐 ICollection ? (Foo的界面)
  • 公开接口为您提供了在不同实现或模拟中交换的附加选项
  • @DarkNightFan 我认为不可能将List&lt;Foo&gt; 分配给IList&lt;IFoo&gt;link 分配给 ideone 编译错误),所以你需要使用IList&lt;Foo&gt;
猜你喜欢
  • 1970-01-01
  • 2010-09-21
  • 2016-09-06
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
相关资源
最近更新 更多