💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 接口(C# 编程指南) 接口包含[类](https://msdn.microsoft.com/zh-CN/library/0b0thckt.aspx)或[结构](https://msdn.microsoft.com/zh-CN/library/ah19swz4.aspx)可以实现的一组相关功能的定义。 例如,使用接口可以在类中包括来自多个源的行为。 由于C#语言不支持多重继承,所以该功能很重要。 此外,如果要模拟结构的继承,也必须使用接口,因为它们无法实际从另一个结构或类继承。 可使用 [interface](https://msdn.microsoft.com/zh-CN/library/87d83y5b.aspx) 关键字定义接口,如以下示例所示。 ``` interface IEquatable<T> { bool Equals(T obj); } ``` 实现 [IEquatable&lt;T&gt;](https://msdn.microsoft.com/zh-CN/library/ms131187.aspx) 接口的任何类或结构都必须包含与该接口指定的签名匹配的 [Equals](https://msdn.microsoft.com/zh-CN/library/ms131190.aspx) 方法的定义。因此,可以依靠实现 IEquatable&lt;T&gt; 的类来包含 Equals 方法,类的实例可以通过该方法确定它是否等于相同类的另一个实例。 IEquatable&lt;T&gt; 的定义不为 Equals 提供实现。该接口仅定义签名。这样,C# 中的接口便类似于其中所有方法都是抽象方法的抽象类。但是,类或结构可以实现多个接口,但是类只能继承单个类(抽象或不抽象)。因此,使用接口可以在类中包括来自多个源的行为。 有关抽象类的详细信息,请参阅[抽象类、密封类及类成员](https://msdn.microsoft.com/zh-CN/library/ms173150.aspx)。 接口可以包含方法、属性、事件、索引器或这四种成员类型的任意组合。有关示例的链接,请参阅[相关章节](#BKMK_RelatedSections)。接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型。接口成员会自动成为公共成员,不能包含任何访问修饰符。成员也不能是[静态](https://msdn.microsoft.com/zh-CN/library/98f28cdx.aspx)成员。 若要实现接口成员,实现类的对应成员必须是公共、非静态,并且具有与接口成员相同的名称和签名。 当类或结构实现接口时,类或结构必须为该接口定义的所有成员提供实现。接口本身不提供类或结构可以通过继承基类功能的方式来继承的任何功能。但是,如果基类实现接口,则从基类派生的任何类都会继承该实现。 下面的示例演示 IEquatable&lt;T&gt; 接口的实现。实现类 Car 必须提供 [Equals](https://msdn.microsoft.com/zh-CN/library/ms131190.aspx) 方法的实现。 ``` 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; } } ``` 类的属性和索引器可以为接口中定义的属性或索引器定义额外的访问器。例如,一个接口可能会声明一个具有 [get](https://msdn.microsoft.com/zh-CN/library/ms228503.aspx) 访问器的属性。实现该接口的类可以声明同时具有 **get** 和 [set](https://msdn.microsoft.com/zh-CN/library/ms228368.aspx) 访问器的相同属性。但是,如果属性或索引器使用显式实现,则访问器必须匹配。有关显式实现的详细信息,请参阅[显式接口实现(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173157.aspx)和[接口属性(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/64syzecx.aspx)。 接口可以实现其他接口。类可能通过它继承的基类或通过其他接口实现的接口来多次包含某个接口。但是,类只能提供接口的实现一次,并且仅当类将接口作为类定义的一部分 (class ClassName : InterfaceName) 进行声明时才能提供。如果由于继承实现接口的基类而继承了接口,则基类会提供接口的成员的实现。但是,派生类可以重新实现接口成员,而不是使用继承的实现。 基类还可以使用虚拟成员实现接口成员。在这种情况下,派生类可以通过重写虚拟成员来更改接口行为。有关虚拟成员的详细信息,请参阅[多态性](https://msdn.microsoft.com/zh-CN/library/ms173152.aspx)。 ## 接口摘要 接口具有以下属性: * 接口类似于抽象基类。实现接口的任何类或结构都必须实现其所有成员。 * 接口无法直接进行实例化。其成员由实现接口的任何类或结构来实现。 * 接口可以包含事件、索引器、方法和属性。 * 接口不包含方法的实现。 * 一个类或结构可以实现多个接口。一个类可以继承一个基类,还可实现一个或多个接口。 ## 本节内容 [显式接口实现(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173157.aspx) 说明如何创建特定于接口的类成员。 [如何:显式实现接口成员(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/44a9ty12.aspx) 提供有关如何显式实现接口的成员的示例。 [如何:显式实现两个接口的成员(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/4taxa8t2.aspx) 提供有关如何使用继承显式实现接口的成员的示例。 <a id="BKMK_RelatedSections"></a> ## 相关章节 * [接口属性(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/64syzecx.aspx) * [接口中的索引器(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/tkyhsw31.aspx) * [如何:实现接口事件(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ak9w5846.aspx) * [类和结构(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173109.aspx) * [继承(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173149.aspx) * [方法(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173114.aspx) * [多态性(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173152.aspx) * [抽象类、密封类及类成员(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173150.aspx) * [属性(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/x9fsa0sw.aspx) * [事件(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/awbftdfh.aspx) * [索引器(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/6x16t2tx.aspx) ## 重要章节 [Learning C# 3.0: Master the Fundamentals of C# 3.0(学习 C# 3.0:掌握 C# 3.0 的基本知识)](https://msdn.microsoft.com/library/orm-9780596521066-01.aspx)中的 [Interfaces(接口)](https://msdn.microsoft.com/library/orm-9780596521066-01-13.aspx) ## 请参阅 [C# 编程指南](https://msdn.microsoft.com/zh-CN/library/67ef8sbd.aspx) [继承(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173149.aspx)