首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >课堂ICollection

课堂ICollection
EN

Stack Overflow用户
提问于 2016-05-20 01:23:04
回答 3查看 56关注 0票数 0

我看到了下面的代码:

代码语言:javascript
复制
public class Basket
{
    public Guid BasketId { get; set; }
    public DateTime Date { get; set; }

    public virtual ICollection<BasketItem> BasketItems { get; set; }

    public Basket()
    {
        BasketItems = new List<BasketItem>();
    }
}

我不太明白的是,为什么我们要

代码语言:javascript
复制
public virtual ICollection<BasketItem> BasketItems { get; set; }

而不是

代码语言:javascript
复制
public virtual List<BasketItem> BasketItems { get; set; }

我能想到的一个原因是,当这个类被继承时,我们可以用不同的类型覆盖BasketItems?

这样做的其他原因是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-20 01:39:42

在可能的情况下避免混凝土类型通常是一个好的设计实践。它实际上给您带来了许多强大的优势,这些优势在SOLID - 坚实维基百科的依赖反转原则中得到了充分的证明。长话短说,不让自己陷入困境是很好的设计,因为它允许用户按他们认为合适的方式扩展属性,这降低了维护,因为作为作者,您不必为ICollection的每个实现创建一个新的类类型。

这里的另一个好处是单元测试。避免具体类型使模拟单元测试中的依赖关系变得更加容易。这导致测试变得更小和更精确。这里有一个很好的解释,可以获得更多的信息- 接口如何使单元测试和模拟变得更容易?

票数 3
EN

Stack Overflow用户

发布于 2016-05-20 01:31:37

因为BasketItems不需要成为一个列表。注意,设置者是公共的。正如您所指出的,它也可以被重写。

本质上说,只要BasketItemsBasketItem的集合,我们就只需要知道这些。我们不在乎集合是如何实现的。

票数 3
EN

Stack Overflow用户

发布于 2016-05-20 01:44:03

还有一件事:ICollection通常也用于DataEntity中的许多/多个关系。您可以引用(MSDN:http://msdn.microsoft.com/en-us/library/92t2ye13.aspx)是一个需要迭代和修改的对象列表。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37336504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档