当我在ArrayList关键字上按f12以转到从vs2008生成的元数据时,我发现生成的类声明如下
public class ArrayList : IList, ICollection, IEnumerable, ICloneable我知道IList已经从ICollection和IEnumerable继承了,那么为什么ArrayList要冗余地继承这些接口呢?
发布于 2009-06-21 08:19:39
好吧,我做了一些研究。如果您创建以下层次结构:
public interface One
{
void DoIt();
}
public interface Two : One
{
void DoItMore();
}
public class Magic : Two
{
public void DoItMore()
{
throw new NotImplementedException();
}
public void DoIt()
{
throw new NotImplementedException();
}
}然后编译它,然后在不同的解决方案中引用DLL,输入Magic并按F12,您将得到以下结果:
public class Magic : Two, One
{
public Magic();
public void DoIt();
public void DoItMore();
}您将看到接口层次结构是扁平的,还是编译器正在将接口添加到?如果你使用反射器,你也会得到同样的结果。
更新:如果您在ILDASM中打开DLL,您将看到它显示:
实现...Two
实现...One。
发布于 2009-06-21 07:38:02
显示额外的接口是因为它们是由IList隐含的。如果实现IList,还必须实现ICollection和IEnumerable。
发布于 2009-06-21 07:41:47
我只是猜测,但我认为实际上它只在代码中实现了IList,但文档也显示了其余的接口,以使其对使用该类的程序员来说是明确的。
https://stackoverflow.com/questions/1023375
复制相似问题