C# 编程/接口
外观
< C# 编程
C# 中的**接口**是一种类似于类的类型定义,但它纯粹表示对象与其使用者之间的契约。它既不能直接实例化为对象,也不能定义数据成员。因此,接口只不过是一组方法和属性声明的集合。以下定义了一个简单的接口
interface IShape
{
double X { get; set; }
double Y { get; set; }
void Draw();
}
在 .NET 框架(以及许多 C# 程序员)中使用的一种**约定**是在接口名称的开头放置一个“I”,以将其与类名称区分开来。当接口仅声明一个关键方法时,例如上述示例中的Draw()
,就会使用另一种常见的接口命名约定。然后,接口名称通过添加“...able”后缀形成形容词。因此,上面的接口名称也可以是IDrawable
。此约定在整个 .NET 框架中使用。
实现接口只需从它继承并在之后定义接口声明的所有方法和属性即可。例如,
class Square : IShape
{
private double _mX, _mY;
public void Draw() { ... }
public double X
{
set { _mX = value; }
get { return _mX; }
}
public double Y
{
set { _mY = value; }
get { return _mY; }
}
}
尽管一个类只能从一个类继承,但它可以从任意数量的接口继承。这是 C# 支持的一种简化的多重继承形式。当从一个类和一个或多个接口继承时,应首先在继承列表中提供基类,然后是任何要实现的接口。例如
class MyClass : Class1, Interface1, Interface2 { ... }
可以使用接口类型声明对象引用。例如,使用前面的示例,
class MyClass
{
static void Main()
{
IShape shape = new Square();
shape.Draw();
}
}
接口可以从任意数量的其他接口继承,但不能从类继承。例如
interface IRotateable
{
void Rotate(double theta);
}
interface IDrawable : IRotateable
{
void Draw();
}
不能为接口成员提供访问说明符(即private
、internal
等),因为所有成员默认都是公共的。实现接口的类必须定义接口声明的所有成员。如果期望在子类中重写已实现的方法,则实现类可以选择将已实现的方法设为虚拟方法。
接口中没有静态方法,但任何静态方法都可以在管理使用它的对象的类中实现。
除了方法和属性之外,接口还可以声明事件和索引器。
对于熟悉 Java 的人来说,C# 的接口与 Java 的非常相似。