接口描述的是可属于任何类或结构的一组相关功能。接口使用 interface 关键字进行定义,如下面的示例所示。
接口可由方法、属性、事件、索引器或这四种成员类型的任意组合构成。接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型。它不能包含静态成员。接口成员是自动公开的,且不能包含任何访问修饰符。
类或结构实现接口时,该类或结构将为该接口定义的所有成员提供实现。接口本身不提供类或结构能够以继承基类功能的方式继承的任何功能。但是,如果基类实现接口,派生类将继承该实现。派生的类被认为是隐式地实现接口。
类和结构按照类继承基类或结构的类似方式实现接口,但有两个例外:
-
类或结构可实现多个接口。
-
类或结构实现接口时,仅接收方法名称和签名,因为接口本身不包含实现,如下面的示例所示。
public class Car : IEquatable<Car> { public string Make {get; set;} public string Model { get; set; } public string Year { get; set; } // Implementation of IEquatable<T> interface public bool Equals(Car car) { if (this.Make == car.Make && this.Model == car.Model && this.Year == car.Year) { return true; } else return false; } }
IEquatable<T> 接口向对象的用户宣布该对象可以确定其是否与同一类型的其他对象相等,而接口的用户不需要知道相关的实现方式。
若要实现接口成员,类中的对应成员必须是公共的、非静态的,并且与接口成员具有相同的名称和签名。类的属性和索引器可以为接口上定义的属性或索引器定义额外的访问器。例如,接口可以声明具有 get 取值函数的属性。实现接口的类可以声明与 获取 和 设置 访问器相同的属性。但是,如果属性或索引器使用显式实现,则访问器必须匹配。有关隐式续行符的更多信息,请参见接口属性(C# 编程指南)。
接口和接口成员是抽象的;接口不提供默认实现。有关更多信息,请参见抽象类、密封类和类成员。
接口可以继承其他接口。类可以通过其继承的基类或其他接口继承的接口多次继承某个接口。但是,类只能实现该接口一次,且仅当把该接口声明作为类的一部分时才可以,如 class ClassName : InterfaceName。如果由于继承了一个实现接口的基类使得接口被继承,则基类会提供其实现。通过使用虚拟成员,基类可能会实现接口成员。在这种情况下,派生类可以通过重写虚拟成员来更改接口行为。有关虚拟成员的更多信息,请参见多态性。
接口具有下列属性:
-
接口类似于抽象基类:实现接口的任何非抽象类型都必须实现接口的所有成员。
-
不能直接实例化接口。
-
接口可以包含事件、索引器、方法和属性。
-
接口不包含方法的实现。
-
类和结构可继承多个接口。
-
接口自身可从多个接口继承。