一個接口定義一個協定。實現接口的類或結構必須遵守其協定。接口可以包含方法、屬性、索引器和事件作為成員。
示例
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
}
}
新聞熱點
疑難解答