Should we use ICollection<T> in the Interface and Collection<T> in the class?
我有一个接口和一个实现它的类。现在我想在这节课上收集一些东西。我在接口部分使用ICollection,在concerte类部分使用Collection?
在这两个部分中使用iCollection是更好的实践还是更灵活的?
另外:我说的"东西"我想在我的类中保留它们的集合,它们也是我拥有的一些其他类的对象,这些类又有自己的接口。那么最好的做法是什么呢?当我想将这些类保存在集合中时,是否还要使用它们的接口类型?
- 我将它初始化为类似于ICollection bar = new List(); ...,然后从那里(在类内和类外)使用ICollection。希望我能正确理解这个问题。注意,ICollection可能太原始,不适合您的需要,因此IList会更好地工作。这是我最后做过一次的事情——从ICollection切换到IList,因为我需要得到命令,而不是使用像集合这样普通的东西。
- 是的,你理解得很正确……就在我问题的第二部分:你记得ICollection还是使用ICollection。foo类的接口
- 尽量保持实际。如果你真的计划改变执行IFoo的行为,并替换一个不同的东西,那么是的,你确实需要一个IFoo(我希望c足够聪明,能够认识到等价性;我没有尝试过)。如果您不需要更改Foo的实现,那么可能没有创建IFoo的好理由。使用ICollection,它更有意义——如果突然需要更好的性能,您希望能够使用不同的数据结构。你可以用"出局"代替"名单",但仍然很好。
- 嗯,秩序?哦,等等!所以我添加到集合中的东西,如果我以后对它们执行foreach循环,它们将不会显示在添加到集合中的smae顺序上?我们有什么订单吗?
- 有,有msdn.microsoft.com/en-us/library/ee211538.aspx。你得问问自己真正的需要是什么。我意识到我开始不遗余力地支持ICollection,但后来意识到我只需要支持当时的数组和列表95%。另外5%的时间我可以打电话给.ToList()或.ToArray(),我负担得起这样做的费用。这与C最酷的特性之一:params T[]很方便地工作。我从来都不需要一个OrderedSet,但只有你最清楚你的问题需要什么。
- @莱昂尼德:非常感谢您的耐心和信息。我学到了很多。抱歉,你的答案在评论中,所以我只是串通投票。
如果你可以展示一个界面,而不是一个类别,展示界面,只展示一个类别,例如,展示界面上没有的方法。你应该在你的界面上和你的班级里都这样做。
理性是信息隐藏是一个"好东西",所以如果你能做到这一点,而不失去一般性,你应该做到这一点。
- 谢谢,所以在@lenoid示例中,您是建议ICollection还是回忆ICollection?(foo接口)
- 通过公开接口,您可以选择在不同的实现或模拟中进行交换。
- @DarkNightFan我认为不可能将List分配给IList(链接到IDeone,但有编译错误),因此您需要使用IList。