【发布时间】:2011-01-13 01:41:13
【问题描述】:
我正在专门考虑泛型类HashSet<T>。它实现了几个接口,但没有一个接口暴露了一个集合的正确语义。具体来说,没有一个支持返回bool 的Add 方法。 (ICollection<T> 支持 void Add,可以在紧要关头使用。)这些接口也不支持常见的集合操作,如联合和交集。 (尽管必须说其中一些操作可以通过扩展IEnumerable<T> 来使用。)
这意味着该类只能像直接实现的集合一样使用。即,您不能这样做:
ISet<int> = new HashSet<int>;
据我所知,无论如何。那么是什么促使我们选择将其排除在外呢?
也许最重要的是:即使您可以将 HashSet<T> 转换为 ICollection<T> 等,您在公开的 API 中也会失去语义价值。也就是说,您的 API 的使用者没有任何迹象表明他们正在使用一组。因此,虽然您可以致电ICollection<T>.Add 并通过,但如果他们尝试添加一个项目两次但它不起作用,人们会感到困惑。一个固定的界面会给人们正确的期望。
【问题讨论】:
-
ISet<T>有什么ICollection<T>没有? -
哦,我想我明白了……一个返回
bool的Add方法,嗯? -
@dan - 您不能将重复项添加到集合中。
-
@dan -
IsSubsetOf、UnionWith等 -
你的意思是只用于它的直接实现?声明 ICollection
的变量/参数,并且您可以访问 add 方法。然而,该合同并没有真正说它是一个集合,但这不是因为显式实现
标签: .net collections interface set