Interface

接口包含类或结构可以实现的一组相关功能的定义。


例如,使用接口可以在类中包括来自多个源的行为。 该功能在 C# 中十分重要,因为该语言不支持类的多重继承。

此外,如果要模拟结构的继承,也必须使用接口,因为它们无法实际从另一个结构或类继承。


可使用 interface 关键字定义接口。 如以下示例所示。

interface IEquatable<T>
{
    bool Equals(T obj);
}

结构名称必须是有效的 C# 标识符名称。 按照约定,接口名称以大写字母 I 开头。


实现 IEquatable 接口的任何类或结构都必须包含与该接口指定的签名匹配的 Equals 方法的定义。 因此,可以依靠实现 IEquatable 的类来包含 Equals 方法,类的实例可以通过该方法确定它是否等于相同类的另一个实例。


IEquatable 的定义不为 Equals 提供实现。 该接口仅定义签名。 这样,C# 中的接口便类似于其中所有方法都是抽象方法的抽象类。

但是,类或结构可以实现多个接口,但是类只能继承单个类(抽象或不抽象)。 因此,使用接口可以在类中包括来自多个源的行为。

  • 接口可以包含方法、属性、事件、索引器或这四种成员类型的任意组合。
  • 接口不能包含常量、字段、运算符、实例构造函数、终结器或类型。
  • 接口成员会自动成为公共成员,不能包含任何访问修饰符。 成员也不能是静态成员。

若要实现接口成员,实现类的对应成员必须是公共、非静态,并且具有与接口成员相同的名称和签名。

  • 当类或结构实现接口时,类或结构必须为该接口定义的所有成员提供实现
  • 接口本身不提供类或结构可以通过继承基类功能的方式来继承的任何功能。

但是,如果基类实现接口,则从基类派生的任何类都会继承该实现。


下面的示例展示了 IEquatable 接口的实现代码。 实现类 Car 必须提供 Equals 方法的实现。

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)
    {
        return this.Make == car.Make &&
               this.Model == car.Model &&
               this.Year == car.Year;
    }
}

类的属性和索引器可以为接口中定义的属性或索引器定义额外的访问器。

例如,接口可能会声明包含 get 取值函数的属性。 实现此接口的类可以声明包含 get 和 set 取值函数的同一属性。 但是,如果属性或索引器使用显式实现,则访问器必须匹配。


接口可以实现其他接口。

类可能通过它继承的基类或通过其他接口实现的接口来多次包含某个接口。 但是,类只能提供接口的实现一次,并且仅当类将接口作为类定义的一部分 (class ClassName : InterfaceName) 进行声明时才能提供。

如果由于继承实现接口的基类而继承了接口,则基类会提供接口的成员的实现。 但是,派生类可以重新实现接口成员,而不是使用继承的实现。


基类还可以使用虚拟成员实现接口成员。 在这种情况下,派生类可以通过重写虚拟成员来更改接口行为。


接口具有以下属性:

  • 接口类似于抽象基类。 实现接口的任何类或结构都必须实现其所有成员。
  • 接口无法直接进行实例化。 其成员由实现接口的任何类或结构来实现。
  • 接口可以包含事件、索引器、方法和属性。
  • 接口不包含方法的实现。
  • 一个类或结构可以实现多个接口。 一个类可以继承一个基类,还可实现一个或多个接口。
原文地址:https://www.cnblogs.com/jizhiqiliao/p/10648928.html