【发布时间】:2010-11-12 23:31:09
【问题描述】:
ArrayList 声明它实现了IList、ICollection 和IEnumeralbe 接口。
为什么不只实现IList,因为IList也是派生自ICollection,而ICollection又派生自IEnumerable。
这种声明的目的是什么? .NET BCL中有很多这样的情况。
【问题讨论】:
ArrayList 声明它实现了IList、ICollection 和IEnumeralbe 接口。
为什么不只实现IList,因为IList也是派生自ICollection,而ICollection又派生自IEnumerable。
这种声明的目的是什么? .NET BCL中有很多这样的情况。
【问题讨论】:
没有有效的区别。我相信额外的声明是为了清楚起见。
在 Reflector 中检查时,在代码中实现 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
【讨论】:
【讨论】: