为什么ICollection不包含Add方法?
在标题中,有没有人知道为什么ICollection
接口不包含Add方法? 似乎很奇怪的是,通用版本ICollection<T>
具有Add
但ICollection
不具有。 任何对此有深入了解的人都会很有帮助。
至于我为什么关心 - 不幸的是,构建SharePoint的开发人员从未学过泛型,因此API中的每个集合都是基于ICollection
非泛型集合。 我想附加几个扩展方法ICollection
,其中包括添加到集合,但这似乎是不可能的(至少不可能没有反思)。
编辑:
不少人正在猜测原因是因为ICollection.Add
需要一个Object
,因此不会是类型安全的。 情况并非如此。 IList
有一个接受Object
的Add
方法。 您只需在采用Object
的方法中进行类型检查和强制转换。
数组实现ICollection
并因此它不能具有Add
也不成立。 如果ICollection
有一个Add
方法,它只需要在数组上显式实现并抛出一个Exception(就像当前许多方法数组所实现的那样)。
我真的希望有人提到一位设计师的解释。
对我来说,接口的命名看起来令人困惑。 ICollection
和ICollection<T>
甚至不在同一个继承链中 - 大多数集合都只是简单地实现了两者。
该文档说明界面的功能,因此单独考虑这一点,不会指望Add
to exist:
为所有非通用集合定义大小,枚举数和同步方法。
我怎么想? 就我个人而言,我认为它可能是直接命名gaff或第二次(当引入通用接口时),设计人员选择将Add
到ICollection<T>
因为这次更常见。
IList
具有Add
和继承ICollection
而IList<T>
不具有Add
并继承ICollection<T>
,它作为Add
。
把它归结为类型层次设计的发展/成熟。
至于扩展方法,您可以执行如下操作:
public static void AnotherMethod<T>(this ICollection<T> collection, T item) { }
并如此使用它:
ICollection<string> s;
s.AnotherMethod("");
ICollection
可以是任何东西。 它可能只是可以枚举的东西。 没有理由应该有一个Add
方法,或者实际上是一个Remove
。 如果您更仔细地查看界面,它几乎是只读的。 你可以看到有多少元素,你可以枚举它们。 而已。 这是一种抽象的方式,非常有意义。
当我们进入ICollection<T>
,我们现在非常具体。 我们确切知道它拥有什么样的对象,因此我们可以:
<T>
新元素。 IEquitable
类型的接口搜索它们。 本质上,区别在于ICollection<T>
有些具体。
来自MSDN
当使用多态方式代替其他集合或集合接口时,不需要将集合类型添加到已知类型。 例如,如果声明一个IEnumerable类型的数据成员并使用它来发送ArrayList的实例,则不需要将ArrayList添加到已知类型。
当您以多种方式使用集合来代替非集合类型时,它们必须添加到已知类型中。 例如,如果您声明Object类型的数据成员并使用它来发送ArrayList的实例,请将ArrayList添加到已知类型。
链接地址: http://www.djcxy.com/p/11037.html