我知道任何Collection(这里我说的是常规非泛型)应该已经实现了ICollection,IEnumerable和IList包含常规对象集合或IDictionary,如果是字典.
[尽管如此,我问的问题并非特定于收藏]
IList派生自ICollection和IEnumerable
ICollection派生自IEnumerable
是不是只使集合(例如ArrayList)实现IList?
在对象浏览器中,它显示集合类(例如ArrayList)正在实现IList,ICollection和IEnumerator.
我知道即使我们指定所有三个集合,.Net也只接受一次定义.
但我的问题是,
是否有任何最佳实践或建议指导我们为集合类指定所有三个接口(或者与此类似的任何类)?
或者只是对象浏览器的属性将其显示为3个单独的实现?[刚查过,发现它不是Object浏览器的属性.对象浏览器只显示类定义中指定的接口]
我相信它只是对象浏览器以这种方式显示它.我刚试过这个:
using System.Collections;
using System.Collections.Generic;
public class Foo : IEnumerable<int>, IEnumerable
{
public IEnumerator<int> GetEnumerator() { return null; }
IEnumerator IEnumerable.GetEnumerator() { return null; }
}
public class Bar : IEnumerable<int>
{
public IEnumerator<int> GetEnumerator() { return null; }
IEnumerator IEnumerable.GetEnumerator() { return null; }
}
Run Code Online (Sandbox Code Playgroud)
将其加载到对象浏览器中会在两个类上显示两个接口.
请注意,如果您继承自另一个实现,有时可能需要重新声明接口 - 如果接口先前已显式实现或以非虚方式实现,则允许您重新实现接口.我不相信这里的情况,但值得一提.
一般来说,你绝对不必指定所有接口,我通常不会这样做.
我相信这只是为了让开发人员清楚,或者帮助加强接口结构。我的意思是,假设您有一个数据结构类的接口,并且实现了 IDataObject。然后,IDataObject 实现 ISecurable 和 ILoggable。您创建的常规类可以只实现 IDataObject,但如果 IDataObject 的创建者稍后更改实现并删除 ILoggable 该怎么办?这可能会改变代码的功能。因此,为了防止这种情况发生,当您创建从 IDataObject 继承的类时,您可以明确表示您还想实现 ISecurable 和 ILoggable,只是为了安全起见。
\n\n我不知道\xe2\x80\x99 不确定他们为什么对 IList 这样做,但这两个原因是我对原因的最佳猜测。
\n