### 一、接口的概念
接口是用来定义一种程序的协定,它好比一种模板,这种模板定义了实现接口的对象必须实现的方法,其目的就是让这些方法可以作为接口实例被引用。接口的定义如下:
```
public interface IPartA
{
void SetDataA(string dataA);
}
```
接口的命名通常以字母 I 开头,如 IpartA、IPartB。接口的成员可以是方法、属性、索引器和事件,但不可以有任何的成员变量,也不能在接口中实现接口成员。接口不能被实例化,接口的成员默认是公共的,因此不允许成员加上修饰符。
[【例](【例2.28】 接口演示.txt)**2.28**[】 接口演示。](【例2.28】 接口演示.txt)
运行结果如图2.38所示。

程序中一共定义了两个接口和一个类。接口 IPartA定义方法 SetDataA,接口 IPartB 定义方法 SetDataB。接口之间也有继承关系,接口 IPartB 继承接口 IPartA,也就继承了接口IPartA的SetDataA方法。接口只能定义方法,实现要由类来完成。SharedClass类派生于接口IPartB,因此要实现IPartB的SetDataB方法,也要实现IPartA的SetDataA方法。
接口允许多重继承:
```
interface ID:IA,IB,IC
{
…
}
```
类可以同时有一个基类和零个以上的接口,并要将基类写在前面:
```
class ClassB:ClassA,IA,IB
{
…
}
```
### 二、接口的实现
指出接口成员所在的接口,则称为显式接口成员。【例2.28】程序接口实现可改写成:
```
// 没有定义为public
void IPartA. SetDataA(string dataA)
{
DataA=dataA;
Console.WriteLine("{0}",DataA);
}
// 没有定义为public
void IParB.SetDataB(string dataB)
{
DataB=dataB;
Console.WriteLine("{0}",DataB);
}
```
显式接口成员只能通过接口来调用。
```
class test
{
static void Main()
{
SharedClass a = new SharedClass();
IPartB partb = a;
partb.SetDataA("interface IPartA");
partb.SetDataB("interface IPartB");
}
}
```
方法本身并不是类 SharedClass 提供的,像 a.SetDataA("interface IPartA")或 a.SetDataB ("interface IPartB")这样的调用都是错误的。显式接口成员没被声明为 public,这是因为这些方法都有着双重身份。当在一个类中使用显式接口成员时,该方法被认为是私有方法,因此不能用类的实例调用它。但是,将类的引用转型为接口引用时,接口中定义的方法就可以被调用,这时它又成为了一个公有方法。
[【例](【例2.29】 显式接口调用.txt)**2.29**[】 显式接口调用](【例2.29】 显式接口调用.txt)[。](【例2.29】 显式接口调用.txt)
运行结果如图2.39所示。
