Welcome

首页 / 软件开发 / C# / 接口的实现

接口的实现2007-11-10 本站 15.4.1 类对接口的实现

前面我们已经说过,接口定义不包括方法的实现部分。接口可以通过类或结构来实现。我们主要讲述通过类来实现接口。用类来实现接口时,接口的名称必须包括在类声明中的基类列表中。

下面的例子给出了由类来实现接口的例子。其中ISequence为一个队列接口,提供了向队列尾部添加对象的成员方法Add(),IRing为一个循环表接口,提供了向环中插入对象的方法Insert(object obj),方法返回插入的位置。类RingSquence实现了接口ISequence和接口IRing。

程序清单15-4:

using System;interface ISequence{ object Add();}interface IRing{ int Insert(object obj);}class RingSequence:ISequence,IRing{ public object Add(){...}public int Insert(object obj){...}}
如果类实现了某个接口,类也隐式地继承了该接口的所有父接口,不管这些父接口有没有在类声明的基类列表中列出。

using System;interface IControl{ void Paint();}interface ITextBox:IControl{ void SetText(string text);}class TextBox:ITextBox{ public void Paint(){...} public void SetText(string text){...}}
这里,类TextBox不仅实现了接口ITextBox,还实现了接口ITextBox的父接口IControl。

前面我们已经看到,一个类可以实现多个接口。再看下面的例子:

using System;interface IControl{ void Paint();}interface IDataBound{ void Bind(Binder b);}public class Control:IControl{ public void Paint(){...}}public class EditBox:Control,IControl,IDataBound{ public void Paint(){...} public void Bind(Binter b){...}}
上例中,类EditBox从Control类继承并同时实现了IControl and IDataBound接口。EditBox中的Paint方法来自IControl接口,Bind方法来自IDataBound接口,二者在EditBox类中都作为公有成员实现。当然,在C#中我们也可以选择不作为公有成员实现接口。

如果每个成员都明显地指出了被实现的接口,通过这种途径被实现的接口我们称之为显式接口成员(explicit interface member)。用这种方式我们改写上面的例子:

public class EditBox:IControl,IDataBound{ void IControl.Paint(){...} void IDataBound.Bind(Binder b){...}}显式接口成员只能通过接口调用。例如:class Test{ static void Main(){EditBox editbox=new EditBox();editbox.Paint(); //error:no such methodIControl control=editbox;control.Paint(); //calls EditBox"s Paint implementation }}
上述代码中对editbox.Paint()的调用是错误的,因为editbox本身并没有提供这一方法。control.Paint()是正确的调用方式。

注意:接口本身不提供所定义的成员的实现,它仅仅说明这些成员,这些成员必须依靠实现接口的类或其它接口的支持。