+ -
当前位置:首页 → 问答吧 → C#接口继承的问题

C#接口继承的问题

时间:2011-12-23

来源:互联网

在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

作者: schinar   发布时间: 2011-12-23

我了个去 不会了

作者: yanbuodiao   发布时间: 2011-12-23

因为接口只是声明功能,没有类继承的含义。
interface IInterfaceRoot{}

interface InterfaceSub: InterfaceRoot{}

这种接口没有InterfaceSub is IInterfaceRoot的含义,而是InterfaceSub也有IInterfaceRoot功能的意思,虽然等于true。

作者: sunzongbao2007   发布时间: 2011-12-23

“接口”是一种引用类型,有点像仅包含抽象成员的抽象基类。 类在从接口实现时必须为该接口的所有成员提供实现。 类虽然只能从一个直接基类派生,但可以实现多个接口。

接口用于为不一定具有“是”关系的类定义特定功能。 例如,System.IEquatable(Of T) 接口可由任何类或构造实现,这些类或构造必须启用代码来确定该类型的两个对象是否等效(但是该类型定义等效性)。 IEquatable(Of T) 不表示基类和派生类之间存在的同一种“是”关系(例如 Mammal 是 Animal)。 有关更多信息,请参见 接口(C# 编程指南)。

摘自MSDN: http://msdn.microsoft.com/zh-cn/library/ms173149.aspx

作者: sunzongbao2007   发布时间: 2011-12-23

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

public interface IAdvancedDraw:IDrawable
{
  void DrawUpsideDown();
}

public class BitmapImage:AdvancedDraw
{
  public void Draw(){}
  public void DrawUpsideDown(){}
}
 

作者: schinar   发布时间: 2011-12-23

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

作者: sunzongbao2007   发布时间: 2011-12-23

首先,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]

作者: ZeroKiseki   发布时间: 2011-12-23

接口不是类继承!

作者: kuki4552993   发布时间: 2011-12-23

还真没注意这个,哈哈。
看来真如6楼说的只是增加可读性而已。

作者: qwertxp   发布时间: 2011-12-23

接口只是定义了行为。相当于是对继承他的类设置了一定的规范。

作者: jiezi316   发布时间: 2011-12-23