抽象类,构造函数和公司

好吧,我正在尝试重用一部分C#代码。 它是一个带有UDP服务器的抽象类,可以在这里看到:

http://clutch-inc.com/blog/?p=4

我已经创建了一个这样的派生类:

public class TheServer : UDPServer { protected override void PacketReceived(UDPPacketBuffer buffer) { } protected override void PacketSent(UDPPacketBuffer buffer, int bytesSent) { } } 

在我的应用程序中,我创建了一个派生类的实例,如下所示:

 TheServer serv = new TheServer(20501); serv.Start(); 

但我有错误,我不明白为什么。 请帮忙。

  1. ‘TheProject.TheServer’不包含带’1’参数的构造函数
  2. ‘TheProject.UDPServer.Start()’由于其保护级别而无法访问
  3. ‘TheProject.UDPServer’不包含带’0’参数的构造函数

构造函数不会在C#中inheritance。 您必须手动链接它们:

 public TheServer(int port) : base(port) { } 

此外,如果Start受保护,则必须创建一种调用它的公共方法:

 public void StartServer() { Start(); } 

派生类需要添加一个参数构造函数,并将其委托给基类:

  public TheServer(int port) : base(port) {} 

此外, Start方法受到保护。 你需要自己的:

 public void StartMe(){base.Start();} 

这些错误实际上有相当简单的原因:

  1. 您尚未在派生类( TheServer )中定义构造函数。 构造函数(当然不同于方法)不会自动inheritance,因此您需要声明与父类中的构造函数匹配的构造函数,并使用以下内容将它们链接在一起:

     public TheServer(int port) : base(port) { // Your code here. } public TheServer() : base() { // Your code here. } 
  2. Start方法在base( UDPServer )类中声明为protected 。 将基类中的访问修饰符更改为public ,或者在需要时找出从派生类调用方法的方法(后者必须由UDPServer的编写者UDPServer )。

  3. 与1相同的原因,除了这是指默认(无参数)构造函数。

希望有所帮助。

您没有使用一个参数定义TheServer构造函数,因此您无法调用TheServer(20501); 您没有为UDPServer定义零参数构造函数,但您使用一个参数定义了一个。 TheServer中的两个方法都受到保护,因此#2上的错误。

  1. 和3。

将一个构造函数添加到调用基础构造函数(UDPServer)的TheServer; 像这样的东西:

 public TheServer(int port) : base(port) {} 

2查看方法Start on UDPServer:它受保护。 这意味着只有该类的子类可以调用它。

 public class TheServer { public TheServer():base(port) { } } var myServer = new TheServer(1337).Brings().All().The().Boys().to().The().Yard() 

您需要将代码发布到Abstract类,但完全可以猜测,

您的UDPServer类中有一个未在TheServer类中实现的ctor …您需要类似……

 public TheServer(int port) : base(port) { ... specifics } 

而且你也忘了重写你的TheServer类中的Start()方法,但它在底层类中标记为私有…你的底层类应该有……

 //In UDPServer protected void Start() { //Code to start } //In TheServer protected void StartTheServer() { base.Start(); } 

并且,为了它的价值,我建议使用:

 UDPServer serv = new TheServer(20501); serv.start(); 

或者,甚至可能更通用,服务器。 取决于你需要在serv上调用什么方法。