2009-08-12 85 views
4

在我的BL(将是一个公共API),我使用的ICollection在我的查找方法的返回类型,如问题<>。关于返回类型与集合

现在在我的GUI,我需要转换的结果反馈给收藏,如:

Collection<Customer> customers = (Collection<Customer>)BL.FindCustomers(); 

这是因为我需要使用一些收藏<>具体方法我返回的列表,这是我不能做与ICollection <>。

这是正确的用法吗?或者,我应该简单地将收益类型从收集<>改为收回<>以避免此转换?

其次,我没有使用IEnumerable,因为它比ICollection更通用,甚至没有像Count这样简单的属性。我真的没有看到在这里归纳返回类型的一个观点。我错过重要的东西吗?

回答

2

使用ICollection的重点是更通用,隐藏更多信息,这是一件好事。

但是,如果您需要将其转换回来,它已变得毫无意义,您不妨返回更具功能的Collection <>。

0

返回ICollection的想法是让你的在你的方法上有更少的耦合。如果你想稍后建立一个列表,而不是一个集合,你可以在不破坏客户端代码的情况下完成它。

如果你使用这只是为了得到一个集合(而不是ICOLlection),比恕我直言,你可以改变为集合,知道你会有一个不太灵活的方法。但无论如何,YAGNI

此外,如果您担心设计,我建议不要将此静态编码为improve the testability您的代码。

0

这可能是因为Collection实现了IList,它有一些额外的ICollection没有的方法,对于你来说是IList。 你错过了哪些方法?

0

如果您要求您的用户使用Collection <>的方法,则应该返回Collection <>而不是ICollection。

或者可能使用具有独立的功能,它是内部的组件返回您需要为您的GUI类型:

internal static ICollection<Customer> FindCustomers() 
{ 
    Collection<Customer> customers = DAL.GetCustomers(); 

    return customers; 
} 
2

你想返回的ICollection的唯一原因是松耦合和继承的效果影响不大。如果你的方法只有1个版本(因为它的静态)你总是知道返回类型(Collection),并且不需要将它作为ICollection。然而,如果你在一个类族中使用,可能有一个返回和ICollection的虚拟或抽象方法,那么在子类实现中,可以返回一个Collection或FunkyCollection或任何实现该接口的对象,所以这给你一个说更多的灵活性,说你只能返回一个集合。但为了您的目的,您应该扩展只是返回类型集合而不是ICollection,因为它是一种不会被重写的静态方法。它也不会导致用户混淆,因为他们不需要投射。

0

其他人都已经给出了这么好的答案,但我只是想澄清一下,不,我不相信你在做什么是理想的。其原因是,如果稍后有人出现并修改/重构/重新实现BL以返回其他类型的ICollection(根据API),那么这不是Collection,您将在GUI中得到运行时错误。然后,如果你真的想要一个Collection(可能,对于一个或多个方便的扩展方法,我猜测?),那么你可以选择返回ICollection创建一个新的集合并将内容从一个复制到另一个。这样,你不会冒着运行时错误的风险。虽然,它最终取决于(作为别人已经问过的)你在Collection中寻找哪种方法(或许有更好的方法来做你想做的事情)。

祝你好运!
-f!