ArrayList
声明它实现了IList
,ICollection
和IEnumeralbe
接口。
为什么不实施IList
,因为IList
也来自ICollection
,ICollection
来自IEnumerable
。
这种宣言的目的是什么?在.NET BCL中有很多这样的情况。
答案 0 :(得分:13)
没有有效的区别。我相信额外的声明是为了清晰起见。
在Reflector中检查时,代码实现IList
的类与代码声明实现所有Ilist
,ICollection
和IEnumerable
的类具有相同的接口声明列表
答案 1 :(得分:7)
使用以下代码:
interface I1 { }
interface I2 : I1 { }
class Foo: I2 { }
如果你通过反思看Foo,你会发现
class Foo: I2, I1 { }
哪个也适用于编译并给出相同的结果。
所以区别是没有意义的,在记录Foo时你也可以用两个接口来编写它。
答案 2 :(得分:1)
我不确定ArrayList
是否有单独的接口实现。请考虑以下代码:
public interface IBase
{
int SomeInt { get; set; }
}
public interface ISub : IBase
{
int SomeOther { get; set; }
}
public class MyClass : ISub
{
public int SomeOther { get; set; }
public int SomeInt { get; set; }
}
MyClass
类型仅直接实现ISub
接口。但是,如果将代码编译到程序集中,然后将该程序集作为引用添加到另一个项目中,请打开对象浏览器并检查MyClass
的基本类型,它将具有如下内容:
Base Types
|- ISub
| |- IBase
|- IBase
|- Object
答案 3 :(得分:-1)