一个接口定义一个协定。实现某接口的类或结构必须遵守该接口定义的协定。一个接口可以从多个基接口继承,而一个类或结构可以实现多个接口。
接口可以包含方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现。接口只指定实现该接口的类或结构必须提供的成员。
接口是一种“主干类”,包含方法签名但是没有方法的实现。在这个方面,接口与抽象类一样,只包含抽象方法。C# 接口非常类似于 Java 接口,工作原理基本一样。
接口的所有成员都定义为公共成员,并且接口不能包含常量、字段(私有数据成员)、构造函数、析构函数或任何类型的静态成员。
如果为接口的成员指定任何修饰符,编译器将会产生错误。
为了实现接口,我们可以从接口派生类。这样的派生类必须为所有接口的方法以及任何必需的属性访问器提供实现,除非派生类声明为抽象的。
接口的声明与 Java 完全一样。在接口定义中,通过单独使用 get 和 set 关键字,属性仅指示它的类型,以及它是只读的、只写的还是可读写的。
接口可以是命名空间或类的成员,并且可以包含下列成员的签名:
方法
属性
索引器
事件
一个接口可从一个或多个基接口继承。在下例中,接口 IMyInterface 从两个基接口 IBase1 和 IBase2 继承:
interface IMyInterface: IBase1, IBase2
{
void MethodA();
void MethodB();
}
接口可以由类和结构实现。实现的接口的标识符出现在类的基列表中。例如:
class Class1: Iface1, Iface2
{
// class members
}
类的基列表同时包含基类和接口时,列表中首先出现的是基类。例如:
class ClassA: BaseClass, Iface1, Iface2
{
// class members
}
有关接口的更多信息,请参见接口。
有关属性和索引器的更多信息,请参见属性声明和索引器声明。
示例
下例说明了接口的实现。在此例中,接口 IPoint 包含属性声明,后者负责设置和获取字段的值。MyPoint 类包含属性实现。
// keyword_interface.cs
// Interface implementation
using System;
interface IPoint
{
// Property signatures:
int x
{
get;
set;
}
int y
{
get;
set;
}
}
class MyPoint : IPoint
{
// Fields:
private int myX;
private int myY;
// Constructor:
public MyPoint(int x, int y)
{
myX = x;
myY = y;
}
// Property implementation:
public int x
{
get
{
return myX;
}
set
{
myX = value;
}
}
public int y
{
get
{
return myY;
}
set
{
myY = value;
}
}
}
class MainClass
{
private static void PrintPoint(IPoint p)
{
Console.WriteLine("x={0}, y={1}", p.x, p.y);
}
public static void Main()
{
MyPoint p = new MyPoint(2,3);
Console.Write("My Point: ");
PrintPoint(p);
}
}
输出
My Point: x=2, y=3