在C#中接口可以扩展另外一个接口.比如在System.Collections命名空间中,ICollection扩展了IEnumerable,而IList又扩展了ICollection和IEnumerable.既然IList已经扩展了ICollection,而ICollection又扩展了IEnumerable,为什么在定义IList时还要再特别其指明扩展IEnumerable呢? 
   public interface IList:ICollection,IEnumerable   还有ArrayList 实现了IList接口,按理说ArrayList也应该同时实现ICollection,IEnumerable接口,但是定义ArrayList的类却是这样说明的:    public class ArrayList:IList,ICollection,IEnumarble,ICloneable

解决方案 »

  1.   

    因为接口只是声明功能,没有类继承的含义。
    interface IInterfaceRoot{}interface InterfaceSub: InterfaceRoot{}这种接口没有InterfaceSub is IInterfaceRoot的含义,而是InterfaceSub也有IInterfaceRoot功能的意思,虽然等于true。
      

  2.   

    “接口”是一种引用类型,有点像仅包含抽象成员的抽象基类。 类在从接口实现时必须为该接口的所有成员提供实现。 类虽然只能从一个直接基类派生,但可以实现多个接口。接口用于为不一定具有“是”关系的类定义特定功能。 例如,System.IEquatable(Of T) 接口可由任何类或构造实现,这些类或构造必须启用代码来确定该类型的两个对象是否等效(但是该类型定义等效性)。 IEquatable(Of T) 不表示基类和派生类之间存在的同一种“是”关系(例如 Mammal 是 Animal)。 有关更多信息,请参见 接口(C# 编程指南)。摘自MSDN: http://msdn.microsoft.com/zh-cn/library/ms173149.aspx
      

  3.   

    看这段代码(来自于书中):
    public interface IDrawable
    {
       void Draw();
    }public interface IAdvancedDraw:IDrawable
    {
       void DrawUpsideDown();
    }public class BitmapImage:AdvancedDraw
    {
       public void Draw(){}
       public void DrawUpsideDown(){}
    }
       
      

  4.   

    是的 书上说的例子也是能够运行成功的。BitmapImage有AdvancedDraw声明的功能,而AdvancedDraw又有IDrawable声明的功能。
    使用方法不同只是一个设计思路上的问题。
      

  5.   

    首先,C#接口继承和类继承不同,首先,类继承不仅是说明继承,而且也是实现继承;而接口继承只是说明继承。也就是说,派生类可以继承基类的方法实现,而派生的接口只继承了父接口的成员方法说明,而没有继承父接口的实现,其次,C#中类继承只允许单继承,但是接口继承允许多继承,一个子接口可以有多个父接口。
    interface IControl
    {
       void Paint();
    }interface ITextBox:IControl
    {
       void SetText(string text);
    }interface IListBox:IControl
    {
       void SetItems(string[] items);
    }interface IComboBox:ITextBox,IListBox
    {
       void SetText(string text);
    }例子中接口ITextBox和IListBox都从接口IControl中继承,也就继承了接口IControl的Paint方法。接口IComboBox从接口ITextBox和IListBox中继承,因此它应该继承了接口ITextBox的SetText方法和IListBox的SetItems方法,还有IControl的Paint方法。
    那么回答问题:如题实际上两种接口继承方式等价,仅仅是增加接口继承的可读性,告诉IList我也实现了IEnumerable,而不必通过继承结构告诉IList,仅此而已,即使不那样写也是可以[b]的!!!!!!!!!!![/b]
      

  6.   

    这样的话,可以只看ArrayList实现了IEnumerable,就可以知道ArrayList是实现了枚举器的,可以被foreach遍历。而不用深入的看IList接口。