簡體   English   中英

抽象類,構造函數和公司

[英]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();

但我有錯誤,我不明白為什么。 請幫忙。

  1. 'TheProject.TheServer'不包含帶'1'參數的構造函數
  2. 'TheProject.UDPServer.Start()'由於其保護級別而無法訪問
  3. 'TheProject.UDPServer'不包含帶'0'參數的構造函數

構造函數不會在C#中繼承。 您必須手動鏈接它們:

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 )中定義構造函數。 構造函數(當然不同於方法)不會自動繼承,因此您需要聲明與父類中的構造函數匹配的構造函數,並使用以下內容將它們鏈接在一起:

     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上調用什么方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM