在本文中,我们使用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#教程。
