在我的BL(将是一个公共API)中,我使用ICollection作为我的Find方法中的返回类型,例如:
public static ICollection<Customer> FindCustomers()
{
Collection<Customer> customers = DAL.GetCustomers();
return customers;
}
请注意使用ICollection而不是Collection&lt;&gt;。
现在在我的GUI中,我需要将结果转换回Collection,例如:
Collection<Customer> customers = (Collection<Customer>)BL.FindCustomers();
这是因为我需要使用一些Collection&lt;&gt;我返回列表中的具体方法,我无法使用ICollection&lt;&gt;。
这是正确的用法吗?或者我应该简单地从Collection&lt;&gt;更改返回类型而不是ICollection&lt;&gt;为了避免这种演员?
其次,我没有使用IEnumerable,因为它比ICollection更通用,甚至没有像Count那样的简单属性。我真的没有看到在这里概括返回类型的重点。我错过了一些重要的事情吗?
答案 0 :(得分:2)
使用ICollection的重点是更通用,隐藏更多信息,这是一件好事。
但是如果你需要将它转换回来它就变得毫无意义了,你也可以返回功能更强大的Collection&lt; &GT;代替。
答案 1 :(得分:2)
您想要返回ICollection的唯一原因是松散耦合和继承属性。如果您的方法只有一个版本(因为它的静态),您将始终知道返回类型(Collection),并且不需要将其设置为ICollection。但是,如果您在一个类系列中使用,可能会有一个返回和ICollection的虚拟或抽象方法,那么在子类实现中,可以返回一个Collection或FunkyCollection或任何实现该接口的对象,因此这会给你一个更多的灵活性,说你只能返回一个集合。但是为了你的目的,你应该只是生成返回类型Collection而不是ICollection,因为它是一个不会被覆盖的静态方法。此外,它会减少用户的混淆,因为他们不需要施放。
答案 2 :(得分:0)
返回ICollection的想法是,在方法上的耦合较少。如果您想稍后构建一个List,而不是一个Collection,那么您将能够在不破坏客户端代码等的情况下完成它。
如果你只是为了得到一个集合(而不是ICollection)而使用它,那么你可以改成收集,知道你将有一个不太灵活的方法。但无论如何,YAGNI。
此外,如果您担心设计问题,我建议您不要将此设置为improve the testability代码。
答案 3 :(得分:0)
这可能是因为Collection实现了IList,它有一些ICollection没有的额外方法,IList足够你。 你错过了哪些方法?
答案 4 :(得分:0)
如果您要求用户使用Collection&lt;&gt;的方法,您应该返回Collection&lt;&gt;而不是ICollection。
或者也许使用具有组件内部的单独函数,它返回GUI所需的类型:
internal static ICollection<Customer> FindCustomers()
{
Collection<Customer> customers = DAL.GetCustomers();
return customers;
}
答案 5 :(得分:0)
其他人已经给出了如此好的答案,但我只想澄清一点,不,我不相信你在做什么是理想的。这样做的原因是,如果有人稍后出现并修改/重构/重新实现您的BL以返回其他类型的ICollection
(根据API)并非真正的Collection
,您将获得GUI中的运行时错误。
但是,您仍然可以选择从BL中返回ICollection
:然后,如果您真的想要Collection
(可能,对于一种或多种方便的扩展方法,我可能猜猜?),那么你可以创建一个新的集合并将内容从一个复制到另一个。这样,您就不会冒运行时错误的风险。虽然,它最终取决于(正如其他人已经问过的)你在Collection
中寻找哪种方法...也许有更好的方法来做你想做的事。