代码之家  ›  专栏  ›  技术社区  ›  Ahmed

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

  •  31
  • Ahmed  · 技术社区  · 16 年前

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

    public class ArrayList : IList, ICollection, IEnumerable, ICloneable
    

    6 回复  |  直到 15 年前
        1
  •  14
  •   RichardOD    16 年前

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

      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();
            }
        }
    

     public class Magic : Two, One
        {
            public Magic();
    
            public void DoIt();
            public void DoItMore();
        }
    

    两个

        2
  •  3
  •   Zr40    16 年前

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

        3
  •  2
  •   Egil Hansen    16 年前

        4
  •  1
  •   Marc    16 年前

    从…起 MSDN ....

    包含具有相同 签名,然后执行 类中的成员将导致 将该成员用作其成员的接口 实施

    还使用显式实现 解决两个接口 每个国家都宣布了不同的国家成员 相同的名称,例如属性和

        5
  •  0
  •   shahkalpesh    16 年前

    我重复上面workmad3所说的。

    通过在ArrayList中实现它,人们可以很容易地知道ArrayList实现了哪些接口,而不是上到ILST发现它实现了ICollection&我数不清。

    这就避免了回去&第四,继承链。

    编辑:在基本级别,实现另一个接口的接口不能提供实现。因此,派生的类(来自IList)间接实现了ICollection&我也是数不清的。因此,即使您编写自己的类来实现IList(而不是在声明中添加ICollection、IEnumerable),您也会看到它必须提供ICollection的实现&我数不清。

        6
  •  0
  •   Benjamin Wegman    15 年前

    我猜想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
    

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

    这表明VB.Net确实如此