接口
一个接口定义一个协定。实现某接口的类或结构必须遵守该接口定义的协定。一个接口可以从多个基接口继承,而一个类或结构可以实现多个接口。
接口可以包含方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现。接口只指定实现该接口的类或结构必须提供的成员。
1.1 接口声明
interface-declaration 是用于声明新的接口类型的 type-declaration(第 错误!未找到引用源。 节)。
interface-declaration:
attributesopt interface-modifiersopt interface identifier interface-baseopt interface-body ;opt
interface-declaration 由下列项组成:一个可选的 attributes 集(第 错误!未找到引用源。 节),后跟一个可选的 interface-modifiers 集(第 1.1.1 节),后面再跟关键字 interface 和命名接口的 identifier,还可根据需要后跟可选的 interface-base 规范(第 1.1.2 节),再后跟 interface-body(第 1.1.3 节),还可选择后跟一个分号。
1.1.1 接口修饰符
interface-declaration 可以根据需要包含一个接口修饰符序列:
interface-modifiers:
interface-modifier
interface-modifiers interface-modifier
interface-modifier:
new
public
protected
internal
private
new 修饰符仅允许在类中定义的接口中使用。它指定接口隐藏同名的继承成员,详见第 错误!未找到引用源。 节中的介绍。
public、protected、internal 和 private 修饰符控制接口的可访问性。根据接口声明所在的上下文,只允许使用这些修饰符中的一部分(第 错误!未找到引用源。 节)。
1.1.2 基接口
接口可以从零个或多个接口继承,被继承的接口称为该接口的显式基接口 (explicit base interface)。当接口具有一个或多个显式基接口时,在该接口声明中,接口标识符后就要紧跟一个冒号以及一个由逗号分隔的基接口标识符列表。
interface-base:
: interface-type-list
接口的显式基接口必须至少与接口本身具有同样的可访问性(第 错误!未找到引用源。 节)。例如,在 public 接口的 interface-base 中指定 private 或 internal 接口就是一个编译时错误。
接口不能从自身直接或间接继承,否则会发生编译时错误。
接口的基接口 (base interface) 包括显式基接口,以及这些显式基接口的基接口。换言之,基接口集是显式基接口、它们的显式基接口(依此类推)的完全可传递的闭包。接口继承其基接口的所有成员。在下面的示例中
interface IControl
{
void Paint();
}
interface ITextBox: IControl
{
void SetText(string text);
}
interface IListBox: IControl
{
void SetItems(string[] items);
}
interface IComboBox: ITextBox, IListBox {}
IComboBox 的基接口是 IControl、ItextBox 和 IListBox。
换言之,上面的 IComboBox 接口继承 SetText、SetItems 以及 Paint。
如果一个类或结构实现某接口,则它还隐式实现该接口的所有基接口。
1.1.3 接口体
接口的 interface-body 定义接口的成员。
interface-body:
{ interface-member-declarationsopt }
1.2 接口成员
接口的成员包括从基接口继承的成员和由接口本身声明的成员。
interface-member-declarations:
interface-member-declaration
interface-member-declarations interface-member-declaration
interface-member-declaration:
interface-method-declaration
interface-property-declaration
interface-event-declaration
interface-indexer-declaration
一个接口声明可以声明零个或多个成员。接口的成员必须是方法、属性、事件或索引器。接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型,也不能包含任何种类的静态成员。
所有接口成员都隐式地具有 public 访问属性。接口成员声明中包含任何修饰符都属于编译时错误。具体来说,不能使用修饰符 abstract、public、protected、internal、private、virtual、override 或 static 来声明接口成员。
在以下示例中:
public delegate void StringListEvent(IStringList sender);
public interface IStringList
{
void Add(string s);
评论