【发布时间】:2009-09-04 15:40:18
【问题描述】:
我想编写解耦和干净的代码,并且我知道通过对接口而不是实现进行编程,我的代码将更加灵活和可扩展。所以,不要写这样的方法:
bool IsProductAvailable(ProductTypeA product);
我写的方法如下:
bool IsProductAvailable(IProduct product);
只要我的产品实现了 IProduct:
class ProductTypeA : IProduct
我应该没事的。一切都很好,直到我开始使用泛型集合。由于 C# 3.0 不支持协变和逆变,即使 ProuctTypeA 和 ProductTypeB 都实现了 IProduct,所以不能将 List 放入 List。这很麻烦,因为很多时候我想写这样的东西:
bool AreProductsAvailable(List<IProduct> products);
这样我就可以通过以下方式检查产品的可用性:
List<ProductA> productsArrived = GetDataFromDataabase();
bool result = AreProductsAvailable(productsArrived);
我只想编写一个适用于所有 IProduct 集合的 AreProductsAvailable() 方法。
我知道 C# 4.0 将支持协变和逆变,但我也意识到其他库似乎已经解决了问题。比如我在试用ILOG Gantt这个甘特图控件,发现他们有很多这样的集合接口:
IActivityCollection
ILinkCollection
所以看起来他们的方法是用接口包装通用集合。所以代替“bool AreProductsAvailable(List products);”,我可以这样做:
bool AreProductsAvailable(IProductCollection products);
然后编写一些代码,以便 IProductCollection 获取 IProduct 的任何通用集合,无论是 List 还是 List。
但是,我不知道如何编写具有“魔力”的 IProductCollection 接口。 :-
有人能给我一些启示吗?这一直困扰着我很长时间,我非常想做“正确的事”。好的,谢谢!
【问题讨论】:
标签: c# collections generics