我正在查看Entity Framework 4的一些代码示例,并且作者创建了一个返回ICollection< Person>的方法。我知道ICollection是一个接口。我知道Person是集合中的对象类型。我知道我正在收回一批人员。
问题。为什么选择ICollection?为什么不列出<>?为什么这样使用接口?我已经使用接口作为类的“蓝图”,指定了所需的成员,但我真的不明白这里的用法。
答案 0 :(得分:12)
在公共API中返回接口而不是具体类通常会更好。
这允许实现稍后更改。例如,它实际上可能正在返回List<T>
。然而,稍后,可以进行优化以返回可以具有更好的存储器效率,允许流传输或许多其他优点之一的不同类型的集合。只要该类仍然实现ICollection<T>
,该实现可以自由切换而不会导致API更改。
答案 1 :(得分:0)
GoF Design Patterns书的一个关键点是编程到接口,而不是实现。其原因是它提供的自由。通过返回接口而不是特定类型,将来可以更容易地更改实现,而不会影响调用代码。
答案 2 :(得分:0)
除非您的用户想要您,否则您的API应尽可能少地公开实现细节,在这种情况下,使用List<Person>
是实现细节。例如,如果您或您的用户知道他们想要按索引访问结果集,那么可能最好返回IList<Person>
而不是ICollection<Person>
,但如果您不确定用户方案,则应该公开最多尽可能基础抽象(即在这种情况下可能IEnumerable<Person>
就足够了。)
请记住,如果最近你决定使用更多派生的返回类型,它不会破坏任何现有的客户端,但你不能使用更多的返回类型而不会破坏其中的一些。