ArrayList
声明实现了 IList
, ICollection
, 和 IEnumeralbe
接口。
为什么不只实现 IList
, 因为 IList
也继承自 ICollection
,而 ICollection
又继承自 IEnumerable
。
这种声明的目的是什么?在 .NET BCL 中有很多类似的情况。
没有实质性的区别。我认为额外声明是为了更清晰明了。
在反射器中检查时,那些在代码中实现 IList
接口的类与那些在代码中声明实现 IList
、ICollection
和 IEnumerable
接口的类拥有相同的接口声明列表。
使用以下代码:
interface I1 { }
interface I2 : I1 { }
class Foo: I2 { }
如果您通过反射查看Foo,您会发现
class Foo: I2, I1 { }
这个代码也可以编译并且得到相同的结果。
因此,区别是无关紧要的,在记录Foo时,最好使用两个接口来写。
我不太确定 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