从技术上讲,接口是一组包含了函数型方法的数据结构,通过这组数据结构。通过这组数据结构,客户代码可以调用组件对象的功能。
声明
接口声明实际上就是一种定义新的接口的类型声明,声明的格式如下:attributes interface-modifiers interface identifier interfacebase interface-body
接口仅可使用下列修饰符:new、public protected、internal、private 在一个接口定义中同一个修饰符不允许出现多次
在接口的声明体中,可以定义接口的声明。接口的成员可以是方法、属性、索引指示器和事件
接口的继承
接口具有不变性,但这并意味着接口不在发展。
注意:接口继承和类继承不同。首先,类继承不仅是说明继承,而且也是实现继承;而接口继承只是说明继承。也就是说,派生类可以继承基类的方法实现,而派生的接口只继承了父接口的成员方法说明,而没有继承父接口的实现,其次,C#中类继承只允许单继承,但是接口继承允许多继承,一个子接口可以有多个父接口。
接口可以从零或多个接口中继承。从多个接口中继承时,用“:”后跟被继承的接口名字,多个接口之间用“,”分割。被继承的接口应该是可以访问得到的,比如从private 类型或internal类型的接口中继承就是不允许的,接口不允许直接或间接地从自身继承。和类的继承相似,接口的继承也形成接口之间的层次接口. 对一个接口的继承也就继承了接口的所有成员。
接口的成员
接口可以包含一个和多个成员,这些成员可以是方法吗、属性、索引指示器和事件,但不能是常量、域、操作符、构造函数、而且不能包含任何静态成员
注意:接口成员默认访问方式是Public。接口成员声明不能包含任何修饰负,比如成员声明前不能加abstract、public、protected、internal、private、virtual、override、static修饰符。接口的成员之间不能相互同名。继承而来的成员不用再声明,但接口可以定义与继承而来的成员同名的成员,这时我们说接口成员覆盖了继承而来的成员,这不会导致错误,但编译器或给出一个警告。关闭警告提示的方式是在成员明前加上个new关键字。如果没有覆盖父接口中的成员,使用new关键字会导致编译器发出警告。
对接口的成员的访问
对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的。如果底层成员的命名与继承而来的高层成员一致,那么底层成员将覆盖同名的高成成员。但由于接口支持多继承,在多继承中,如果两个父接口含有同名的成员,这就产生了二义性(这也正是C#取消了类的多继承机制的原因之一),这时需要进行显式的声明。
接口的实现
注意:接口本身不提供所定义的成员的实现,它仅仅说明这些成员,这些成员必须依靠实现接口的类或其他接口的支持
显示接口成员执行体
为了实现接口,类可以声明显示接口成员执行体。显示接口成员执行体可以是一个方法、一个属性、一个事件或者是一个索引指示器的声明。声明与该成员对应的全权名应保持一直.。
注意:不能在方法调用、属性访问以及索引指示器访问中通过全权名访问显示接口成员执行体。事实上,显示接口成员执行体只能通过接口的实例,仅仅引用接口的成员名称来访问。显示接口成员执行体不能使用任何访问限制符,也不能加上abstract,virtual,override或static 修饰符.
显示接口成员执行体和其他成员有着不同的访问方式。因为不能在方法调用、属性访问以及索引指示器中通过全权名访问,显示接口成员执行体在某种意义上是私有的,但他们又可以通过接口的实例访问,也具有一定的公有性质。使用显示接口成员执行体通常有两个目的:
因为显示接口成员执行体不能通过类的实例进行访问,这就可以从公有接口中把接口的实现部分单独分离开,如果一个类只在内部使用该接口,而类的使用者不会直接使用到该接口,这种显示接口成员执行体就可有起到作用。
显示接口成员执行体避免了接口成员之间因为同名而发生混淆。如果一个类希望对名称和返回类型相同的接口成员采用不同的实现方式,这就必须要使用到显示接口成员执行体,如果没有显示接口成员执行体,那么对于名称和返回类型不同的接口成员,类也无法进行实现。