为什么C#中的集合类(如ArrayList)从多个接口继承,如果其中一个接口继承其余接口?

StackOverflow https://stackoverflow.com/questions/1023375

当我按下ArrayList关键字上的f12转到从vs2008生成的元数据时,我发现生成的类声明如下

public class ArrayList : IList, ICollection, IEnumerable, ICloneable

我知道IList已经从ICollection和IEnumerable继承了,那么为什么ArrayList会冗余地继承这些接口呢?

有帮助吗?

解决方案

好的,我做了一些研究。如果您创建以下层次结构:

  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,你会看到它说:

实现......两个

实施......一个。

其他提示

显示额外的接口,因为IList暗示了它们。如果实现IList,则还必须实现ICollection和IEnumerable。

我只是猜测,但我认为实际上它只在代码中实现了IList,但是文档显示了其余的接口以及使用该类对程序员显示它。

来自 MSDN ....

  

如果一个类实现了两个接口   包含具有相同成员的成员   签名,然后实现   班上的成员将导致两者   接口使用该成员作为他们的   实现。

     

还使用了显式实现   解决两个接口的情况   每个人都声明了不同的成员   同名,如财产和   方法:

不要接受这个作为答案。

我正在重复上面所说的workmad3。

通过在ArrayList中实现它,人们很容易知道 - ArrayList实现了哪些接口而不是IList发现它实现了ICollection& IEnumerable的。

这避免了回去的必要性。继承链。

编辑:在基础级别,实现另一个接口的接口无法提供实现。派生的类(来自IList)因此间接实现ICollection& IE也就是这样。因此,即使您编写自己的类实现IList(并且不在声明中添加ICollection,IEnumerable) - 您将看到它必须提供ICollection&的实现。 IEnumerable的。

而workmad3的推理是有道理的。

我的猜测是CLR不支持从其他接口继承的接口。

然而,C#支持这种结构,但必须将继承树“展平”为符合CLR。

[编辑]

从以下建议后快速设置VB.Net项目:

Public Interface IOne
    Sub DoIt()
End Interface

Public Interface ITwo
    Inherits IOne
    Sub DoIt2()
End Interface

Public Class Class1
    Implements ITwo

    Public Sub DoIt() Implements IOne.DoIt
        Throw New NotImplementedException()
    End Sub

    Public Sub DoIt2() Implements ITwo.DoIt2
        Throw New NotImplementedException()
    End Sub
End Class

在以下(C#)中编译结果:

public class Class1 : ITwo
{
    public Class1();
    public void DoIt();
    public void DoIt2();
}

这表明VB.Net NOT 将界面层次结构扁平化而不是C#。我不清楚为什么会这样。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top