抽象类,构造函数和公司
好吧,我正在尝试重用一部分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();
但我有错误,我不明白为什么。 请帮忙。
- ‘TheProject.TheServer’不包含带’1’参数的构造函数
- ‘TheProject.UDPServer.Start()’由于其保护级别而无法访问
- ‘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();}
这些错误实际上有相当简单的原因:
-
您尚未在派生类(
TheServer
)中定义构造函数。 构造函数(当然不同于方法)不会自动inheritance,因此您需要声明与父类中的构造函数匹配的构造函数,并使用以下内容将它们链接在一起:public TheServer(int port) : base(port) { // Your code here. } public TheServer() : base() { // Your code here. }
-
Start
方法在base(UDPServer
)类中声明为protected
。 将基类中的访问修饰符更改为public
,或者在需要时找出从派生类调用方法的方法(后者必须由UDPServer
的编写者UDPServer
)。 - 与1相同的原因,除了这是指默认(无参数)构造函数。
希望有所帮助。
您没有使用一个参数定义TheServer构造函数,因此您无法调用TheServer(20501); 您没有为UDPServer定义零参数构造函数,但您使用一个参数定义了一个。 TheServer中的两个方法都受到保护,因此#2上的错误。
- 和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上调用什么方法。