規範|介面
一個介面定義一個協定。實現介面的類或結構必須遵守其協定。介面可以包含方法、屬性、索引器和事件作為成員。
樣本
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
}
}