7

好吧,我正在尝试重用一部分 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”参数的构造函数
4

8 回答 8

13

构造函数在 C# 中不会被继承。您将不得不手动链接它们:

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

此外,如果 Start 受到保护,您将必须创建某种调用它的公共方法:

public void StartServer()
{
    Start();
}
于 2009-05-01T13:05:34.547 回答
8

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

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

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

public void StartMe(){base.Start();}
于 2009-05-01T13:04:26.967 回答
2

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

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

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

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

希望有帮助。

于 2009-05-01T13:08:38.093 回答
0

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

于 2009-05-01T13:03:19.013 回答
0
  1. 和 3。

向 TheServer 添加一个构造函数,该构造函数调用(UDPServer 的)基本构造函数;像这样的东西:

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

2 检查方法 Start on UDPServer:它是受保护的。这意味着只有该类的子类才能调用它。

于 2009-05-01T13:05:36.450 回答
0
public class TheServer 
{   
    public TheServer():base(port) {
    }    
}

var myServer = new TheServer(1337).Brings().All().The().Boys().to().The().Yard()
于 2009-05-01T13:06:06.277 回答
0

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

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

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

而且您还忘记了覆盖 TheServer 类中的 Start() 方法,但它在基础类中标记为私有...您的基础类应该具有类似...

//In UDPServer
protected void Start()
{
   //Code to start
}

//In TheServer
protected void StartTheServer()
{
   base.Start();
}
于 2009-05-01T13:06:19.893 回答
0

而且,对于它的价值,我建议使用:

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

或者,也许更通用的是 Server。取决于您需要在 serv 上调用什么方法。

于 2009-05-01T13:40:04.883 回答