一个接口定义一个协定。实现接口的类或结构必须遵守其协定。接口可以包含方法、属性、索引器和事件作为成员。
示例
interface iexample{ string this[int index] { get; set; } event eventhandler e; void f(int value); string p { get; set; }}public delegate void eventhandler(object sender, eventargs e);
显示了一个包含索引器、事件 e
、方法 f
和属性 p
的接口。
接口可以使用多重继承。在下面的示例中,
interface icontrol{ void paint();}interface itextbox: icontrol{ void settext(string text);}interface ilistbox: icontrol{ void setitems(string[] items);}interface icombobox: itextbox, ilistbox {}
接口 icombobox
同时从 itextbox
和 ilistbox
继承。
类和结构可以实现多个接口。在下面的示例中,
interface idatabound{ void bind(binder b);}public class editbox: control, icontrol, idatabound{ public void paint() {...} public void bind(binder b) {...}}
类 editbox
从类 control
派生,并且同时实现 icontrol
和 idatabound
。
在前面的示例中,icontrol
接口中的 paint
方法和 idatabound
接口中的 bind
方法是使用 editbox
类的公共成员实现的。c# 提供了另一种方式来实现这些方法,使得实现类避免将这些成员设置成公共的。这就是:接口成员可以用限定名来实现。例如,在 editbox
类中将 paint
方法命名为 icontrol.paint
,将 bind
方法命名为 idatabound.bind
方法。
public class editbox: icontrol, idatabound{ void icontrol.paint() {...} void idatabound.bind(binder b) {...}}
用这种方式实现的接口成员称为显式接口成员,这是因为每个成员都显式地指定要实现的接口成员。显式接口成员只能通过接口来调用。例如,在 editbox
中实现的 paint
方法只能通过强制转换为 icontrol
接口来调用。
class test{ static void main() {editbox editbox = new editbox();editbox.paint(); // error: no such methodicontrol control = editbox;control.paint(); // calls editbox\'s paint implementation }}
最新评论