C# 中允许的接口成员
介绍
在 C# 中,接口围绕两个主要概念:契约和继承。接口基本上是一种语法契约,它定义了继承特定接口的类应遵循的准则。简而言之,接口定义了契约的内容,而从接口派生的类定义了契约的方式。基本上,接口提供的功能与抽象类非常相似。
在本指南中,我们将介绍该合同的每个部分,并了解它们如何结合在一起以提供我们今天喜爱和使用的功能。
接口
我们有几个不同的接口成员:
- 特性
- 方法
- 活动
- 索引器
这些就像骨架,派生类需要负责用功能填充它们。
在此演示中,我们将声明一个名为ServerInterface的接口。
public interface ServerInterface
{
string name { get; set; }
string status { get; set; }
void restart();
void getStatus();
void start();
void stop();
event EventHandler statusChanged;
}
这个接口声明了两个属性,name和status。它还声明了四个方法,restart、start、stop和getStatus。我们有一个名为statusChanged的事件处理程序。
为了执行我们的合同,服务器类需要从这个接口继承。
public class Server : ServerInterface
{
}
由于合约的性质,我们需要在类中定义继承的成员。如果我们不定义它们,我们的编译器会报出以下错误:
'Server' does not implement interface member 'ServerInterface.name'
'Server' does not implement interface member 'ServerInterface.type'
'Server' does not implement interface member 'ServerInterface.restart()'
'Server' does not implement interface member 'ServerInterface.status()'
'Server' does not implement interface member 'ServerInterface.statusChanged'
这明确地告诉我们需要做什么。让我们看一下完整的应用程序并对其进行剖析。
using System;
namespace Pluralsight
{
public interface ServerInterface
{
string name { get; set; }
string status { get; set; }
void restart();
void stop();
void start();
void getStatus();
event EventHandler statusChanged;
}
public class MyEventArgs : EventArgs
{
}
public class Server : ServerInterface
{
public string name { get; set; }
public string status { get; set; }
public event EventHandler statusChanged;
public Server(string Name)
{
name = Name;
status = "off";
}
public void getStatus()
{
Console.WriteLine($"THe server: {this.name} is {this.status}");
}
public void start()
{
if(this.status == "off") { Console.WriteLine($"Starting server: {this.name}"); this.status = "on"; }
else if(this.status == "on") { Console.WriteLine($"THe server: {this.name} is already started!"); }
else { Console.WriteLine($"The server is in an unknown state!"); }
}
public void stop()
{
if (this.status == "off") { Console.WriteLine($"The server: {this.name} is already stopped!"); }
else if (this.status == "on") { Console.WriteLine($"Stopping server: {this.name}"); this.status = "off"; }
else { Console.WriteLine($"The server is in an unknown state!"); }
}
public void restart() {
Console.WriteLine($"Event for restarting the server caught: {this.name}");
}
protected virtual void restart(MyEventArgs e)
{
statusChanged?.Invoke(this, e);
}
}
public class Interfacing
{
public static void Main()
{
Server a = new Server("Domain Controller");
a.start();
a.stop();
a.restart();
Console.ReadKey();
}
}
}
产生的输出如下:
Starting server: Domain Controller
Stopping server: Domain Controller
Event for restarting the server caught: Domain Controller
需要做的就是实现我们合同中的部分。我们定义了具体的方法、属性和事件处理程序。在Main()函数中,我们从接口继承的类单独出现。我们看到实例被初始化,然后调用适当的方法来执行它们的职责。与重启操作相关的事件也被触发。
接口与抽象类
虽然接口和抽象类的概念围绕着同一个想法,但重要的是要列出事实并决定在什么情况下使用哪一个。虽然接口无法实例化,但抽象类可以。由于查找适当签名的时间,接口比抽象类慢得多。默认情况下,接口不能具有访问说明符,而抽象类可以。接口只能有抽象方法,而抽象类可以具有非抽象方法的完整实现。
结论
在本指南中,我们了解了如何实现接口成员以及如何在实际示例中利用它们来发挥我们自己的优势。我们还学习了如何实现不同的成员。我们还研究了抽象类和接口之间的区别,现在我们可以决定在特定情况下使用哪一个。我希望本指南对您有所帮助,并感谢您阅读它。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~