为什么List 实现IList ,ICollection 和IEnumerable ?
如果你去定义List
你会看到以下内容:
public class List : IList, ICollection, IEnumerable
IList
已经从ICollection
和IEnumerable
inheritance。
如果List
只实现了IList
那还不够吗?
是的,在这种情况下没有任何区别。 在某些情况下,如果您使用的是已经实现了接口的基类,但您希望自己重新实现它,那么它可能会有所不同 – 但在这种情况下,没有基类(除了隐式object
)并且它会有表现完全一样。
与我的回忆相反,我认为无论代码是否明确声明所有接口,在元数据中表示类的方式都有所不同。 这是一个例子:
interface IFoo {} interface IBar : IFoo {} class FooBar1 : IBar {} class FooBar2 : IBar, IFoo {}
ildasm和Reflector都显示了FooBar1
和FooBar2
的相同信息……它显示了它们都实现了IBar
和IFoo
。
换句话说,我们无法判断List
的原始源代码是否实际指定了所有接口。 也许它确实如此,也许它没有 – 但无论如何都无所谓。
编辑:为了完整性,我还检查了你用另一个接口扩展两个接口的情况。 在这种情况下,我也无法找到元数据的差异。 我确信我记得有些情况很明显,但我现在找不到它。
是的,它会。 IList
本身实现了另外两个。
对象浏览器显示该类实现的所有接口,无论是直接( IList
)还是间接( ICollection
, IEnumerable
, 通过 IList
)。
这不是它在幕后实际编码的方式。 这就是Reflector等工具在将IL转回C#时向您展示的内容。