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

派生クラスは、1 つのパラメーターのコンストラクターを追加し、それを基本クラスに委任する必要があります。

 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

1 つの引数で TheServer コンストラクターを定義しなかったため、TheServer(20501) を呼び出すことはできません。UDPServer のゼロ引数コンストラクターを定義していませんが、1 つの引数を持つコンストラクターを定義しています。TheServer の 2 つのメソッドは保護されているため、#2 のエラーです。

于 2009-05-01T13:03:19.013 に答える
0

そして、それが価値があるために、私は使用することをお勧めします:

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

または、おそらくさらに一般的な Server. サーブでどのメソッドを呼び出す必要があるかによって異なります。

于 2009-05-01T13:40:04.883 に答える
0
  1. そして3。

(UDPServer の) 基本コンストラクターを呼び出すコンストラクターを TheServer に追加します。このようなもの:

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 クラスに投稿する必要がありますが、完全な推測では、

UDPServer クラスに、 TheServerctorクラスに実装していない があります...次のようなものが必要です...

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 に答える