接口Interfaces

本文内容

接口定义了可由类和结构实现的协定。接口可以包含方法、属性、事件和索引器。接口不提供所定义的成员的实现代码,仅指定必须由实现接口的类或结构提供的成员。

接口可以采用多重继承在以下示例中,接口 IComboBox 同时继承自 ITextBoxIListBox

  1. interface IControl
  2. {
  3. void Paint();
  4. }
  5. interface ITextBox: IControl
  6. {
  7. void SetText(string text);
  8. }
  9. interface IListBox: IControl
  10. {
  11. void SetItems(string[] items);
  12. }
  13. interface IComboBox: ITextBox, IListBox {}

类和结构可以实现多个接口。在以下示例中,类 EditBox 同时实现 IControlIDataBound

  1. interface IDataBound
  2. {
  3. void Bind(Binder b);
  4. }
  5. public class EditBox: IControl, IDataBound
  6. {
  7. public void Paint() { }
  8. public void Bind(Binder b) { }
  9. }

当类或结构实现特定接口时,此类或结构的实例可以隐式转换成相应的接口类型。例如

  1. EditBox editBox = new EditBox();
  2. IControl control = editBox;
  3. IDataBound dataBound = editBox;

如果已知实例不是静态地实现特定接口,可以使用动态类型显式转换功能。例如,以下语句使用动态类型显式转换功能来获取对象的 IControlIDataBound 接口实现代码。因为对象的运行时实际类型是 EditBox,所以显式转换会成功。

  1. object obj = new EditBox();
  2. IControl control = (IControl)obj;
  3. IDataBound dataBound = (IDataBound)obj;

在前面的 EditBox 类中,IControl 接口中的 Paint 方法和 IDataBound 接口中的 Bind 方法均使用公共成员进行实现。C# 还支持显式接口成员实现代码,这样类或结构就不会将成员设为公共成员。显式接口成员实现代码是使用完全限定的接口成员名称进行编写。例如,EditBox 类可以使用显式接口成员实现代码来实现 IControl.PaintIDataBound.Bind 方法,如下所示。

  1. public class EditBox: IControl, IDataBound
  2. {
  3. void IControl.Paint() { }
  4. void IDataBound.Bind(Binder b) { }
  5. }

显式接口成员只能通过接口类型进行访问。例如,只有先将 EditBox 引用转换成 IControl 接口类型,才能调用上面 EditBox 类提供的 IControl.Paint 实现代码。

  1. EditBox editBox = new EditBox();
  2. editBox.Paint(); // Error, no such method
  3. IControl control = editBox;
  4. control.Paint(); // Ok