一个接口定义一个协定。实现接口的类或结构必须遵守其协定。接口可以包含方法、属性、索引器和事件作为成员。
示例
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 method
icontrol control = editbox;
control.paint(); // calls editbox's paint implementation
}
}
新闻热点
疑难解答