[英]Abstract class, constructors and Co
好吧,我正在嘗試重用一部分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();
但我有錯誤,我不明白為什么。 請幫忙。
構造函數不會在C#中繼承。 您必須手動鏈接它們:
public TheServer(int port)
: base(port)
{
}
此外,如果Start受保護,則必須創建一種調用它的公共方法:
public void StartServer()
{
Start();
}
派生類需要添加一個參數構造函數,並將其委托給基類:
public TheServer(int port) : base(port) {}
此外, Start
方法受到保護。 你需要自己的:
public void StartMe(){base.Start();}
這些錯誤實際上有相當直接的原因:
您尚未在派生類( TheServer
)中定義構造函數。 構造函數(當然不同於方法)不會自動繼承,因此您需要聲明與父類中的構造函數匹配的構造函數,並使用以下內容將它們鏈接在一起:
public TheServer(int port) : base(port) { // Your code here. } public TheServer() : base() { // Your code here. }
Start
方法在base( UDPServer
)類中聲明為protected
。 將基類中的訪問修飾符更改為public
,或者在需要時找出從派生類調用方法的方法(后者必須是UDPServer
的編寫者所UDPServer
)。
希望有所幫助。
您沒有使用一個參數定義TheServer構造函數,因此您無法調用TheServer(20501); 您沒有為UDPServer定義零參數構造函數,但您使用一個參數定義了一個。 TheServer中的兩個方法都受到保護,因此#2上的錯誤。
將一個構造函數添加到調用基礎構造函數(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上調用什么方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.