在本文中,我们使用C#中的接口。
接口定义了必须由扩展接口的类和结构实现的契约。
遥控器是观众和电视之间的接口。它是此电子设备的接口。遥控器的用户不必了解特定遥控器的实际工作原理;他们只需要知道界面:红色或绿色按钮的作用,箭头按钮的功能是什么。
另一个常见的界面类比是道路交通规则。它们是驾车者、骑自行车者和行人必须遵守的规则。
接口是:
- API
- 合同
对象通过它们公开的方法与外界交互。实际的实现对程序员来说并不重要,或者它也可能是秘密的。一家公司可能会出售一个图书馆,但它不想透露实际的实施情况。程序员可能会在GUI工具包的窗口上调用Maximize
方法,但对这个方法是如何实现的一无所知。从这个角度来看,接口是对象与外界交互的方式,而不暴露太多很多关于他们的内部运作。
从第二个角度来看,接口就是契约。如果达成一致,则必须遵守。它们用于设计应用程序的架构。它们有助于组织代码。
接口是完全抽象的类型。它们是使用interface
关键字声明的。接口只能具有方法、属性、事件或索引器的签名。所有接口成员都隐含地具有公共访问权限。接口成员不能指定访问修饰符。接口不能有完全实现的方法,也不能有成员字段。一个C#类可以实现任意数量的接口。一个接口还可以扩展任意数量的接口。实现接口的类必须实现接口的所有方法签名。
接口用于模拟多重继承。一个C#类只能从一个类继承,但它可以实现多个接口。使用接口的多重继承不是关于继承方法和变量。它是关于继承由接口描述的思想或契约。
接口和抽象类之间有一个重要区别。抽象类为继承层次结构中相关的类提供部分实现。另一方面,接口可以由彼此不相关的类实现。
例如,我们有两个按钮。一个经典按钮和一个圆形按钮。两者都继承自为所有按钮提供一些通用功能的抽象按钮类。实现类是相关的,因为它们都是按钮。另一个例子可能有类Database
和SignIn
。它们彼此无关。我们可以应用一个ILoggable
接口,强制他们创建一个方法来进行日志记录。
C#简单界面
下面的程序使用了一个简单的界面。
namespace SimpleInterface; interface IInfo { void DoInform(); } class Some : IInfo { public void DoInform() { Console.WriteLine("This is Some Class"); } } class Program { static void Main(string[] args) { var some = new Some(); some.DoInform(); } }
这是一个演示界面的简单C#程序。
interface IInfo { void DoInform(); }
这是一个接口IInfo
。它具有DoInform
方法签名。
class Some : IInfo
我们实现了IInfo
接口。要实现特定接口,我们使用冒号(:)运算符。
public void DoInform() { Console.WriteLine("This is Some Class"); }
该类提供了DoInform
方法的实现。
C#多接口
下一个示例展示了一个类如何实现多个接口。
namespace MultipleInterfaces; interface Device { void SwitchOn(); void SwitchOff(); } interface Volume { void VolumeUp(); void VolumeDown(); } interface Pluggable { void PlugIn(); void PlugOff(); } class CellPhone : Device, Volume, Pluggable { public void SwitchOn() { Console.WriteLine("Switching on"); } public void SwitchOff() { Console.WriteLine("Switching on"); } public void VolumeUp() { Console.WriteLine("Volume up"); } public void VolumeDown() { Console.WriteLine("Volume down"); } public void PlugIn() { Console.WriteLine("Plugging In"); } public void PlugOff() { Console.WriteLine("Plugging Off"); } } class Program { static void Main(string[] args) { var cellPhone = new CellPhone(); cellPhone.SwitchOn(); cellPhone.VolumeUp(); cellPhone.PlugIn(); } }
我们有一个继承自三个接口的CellPhone
类。
class CellPhone : Device, Volume, Pluggable
该类实现了所有三个接口,以逗号分隔。CellPhone
类必须实现所有三个接口的所有方法签名。
$ dotnet run Switching on Volume up Plugging In
C#多接口继承
下一个示例显示接口如何从多个其他接口继承。
namespace InterfaceInheritance; interface IInfo { void DoInform(); } interface IVersion { void GetVersion(); } interface ILog : IInfo, IVersion { void DoLog(); } class DBConnect : ILog { public void DoInform() { Console.WriteLine("This is DBConnect class"); } public void GetVersion() { Console.WriteLine("Version 1.02"); } public void DoLog() { Console.WriteLine("Logging"); } public void Connect() { Console.WriteLine("Connecting to the database"); } } class Program { static void Main(string[] args) { var db = new DBConnect(); db.DoInform(); db.GetVersion(); db.DoLog(); db.Connect(); } }
我们定义了三个接口。我们可以按层次结构组织接口。
interface ILog : IInfo, IVersion
ILog
接口继承自另外两个接口。
public void DoInform() { Console.WriteLine("This is DBConnect class"); }
DBConnect
类实现了DoInform
方法。该方法由类实现的ILog
接口继承。
$ dotnet run This is DBConnect class Version 1.02 Logging Connecting to the database
在本文中,我们介绍了C#接口。
列出所有C#教程。