Frage

Nun, ich versuche, einen Teil von C # Code wiederverwenden. Es ist eine abstrakte Klasse mit UDP-Server, die hier zu sehen sind:

http://clutch-inc.com/blog/?p=4

Ich habe eine abgeleitete Klasse wie folgt erstellt:

public class TheServer : UDPServer
{
    protected override void PacketReceived(UDPPacketBuffer buffer)
    {
    }

    protected override void PacketSent(UDPPacketBuffer buffer, int bytesSent)
    {
    }
}

Und in meinem app Ich habe eine Instanz der abgeleiteten Klasse wie folgt erstellt:

TheServer serv = new TheServer(20501);
serv.Start();

Aber ich habe Fehler, und ich nicht wirklich verstehen, warum. Bitte helfen.

  1. 'TheProject.TheServer' nicht enthalten einen Konstruktor, der ‚1‘ nimmt Argumente
  2. 'TheProject.UDPServer.Start ()' ist unzugänglich aufgrund seines Schutz Ebene
  3. 'TheProject.UDPServer' tut keinen Konstruktor enthalten, nimmt '0' Argumente
War es hilfreich?

Lösung

Constructors nicht in C # geerbt bekommen. Sie werden an der Kette haben sie manuell:

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

Auch wenn Start-geschützt ist, werden Sie eine Art öffentlichen Methode zu schaffen, die es nennt:

public void StartServer()
{
    Start();
}

Andere Tipps

Ihre abgeleitete Klasse benötigt einen Ein-Parameter-Konstruktor hinzuzufügen, und es auf die Basisklasse zu delegieren:

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

Auch ist die Start Verfahren geschützt. Sie müssen Ihre eigenen:

public void StartMe(){base.Start();}

Diese Fehler haben eigentlich recht einfach Ursachen:

  1. Sie haben keinen Konstruktor in der abgeleiteten Klasse (TheServer) definiert. Constructors (im Gegensatz zu Methoden natürlich) nicht automatisch vererbt, so dass Sie müssen Konstrukteure erklären, den mir diejenigen in der übergeordneten Klasse entsprechen und die Kette sie zusammen etwas mit wie:

    public TheServer(int port) : base(port)
    {
        // Your code here.
    }
    
    public TheServer() : base()
    {
        // Your code here.
    }
    
  2. Die Start Methode wird als protected in der Basis (UDPServer) Klasse deklariert. Entweder den Zugriffsmodifikator in der Basisklasse ändern, public oder einen Weg finden, um das Verfahren von der abgeleiteten Klasse zu rufen, wenn Sie müssen (letzteres muss vom Schreiber UDPServer bestimmt wurde).

  3. Aus demselben Grund wie 1, außer dies bezieht sich auf den Standardwert (parameter) Konstruktor.

Ich hoffe, das hilft.

Sie haben keinen theserver Konstruktor mit einem Argument definieren, so dass Sie nicht theserver anrufen (20501); Sie hat keinen Null Argumente Konstruktor für UDPServer definieren, aber Sie definiert ein mit einem Argument. Ihre beiden Methoden in theserver geschützt werden, daher die Fehler auf # 2.

  1. 3.

einen Konstruktor theserver hinzufügen, die die Basis Konstruktor ruft (von UDPServer); so etwas wie folgt aus:

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

2 Überprüfen Sie die Methode Start am UDPServer out: ist geschützt. Dies bedeutet, dass nur Unterklassen dieser Klasse können es nennen.

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

var myServer = new TheServer(1337).Brings().All().The().Boys().to().The().Yard()

Sie müssen den Code in Ihrer abstrakten Klasse schreiben, aber bei einer vollständigen Vermutung,

Sie haben einen ctor in Ihrer UDPServer Klasse bekommen, die Sie nicht in Ihrer theserver Klasse implementiert haben ... Sie brauchen so etwas wie ...

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

Und Sie haben auch die Start () Methode in Ihrer theserver Klasse außer Kraft zu setzen vergessen aber sein als privat markiert in der zugrunde liegenden Klasse ... Ihre zugrunde liegende Klasse soll etwas wie ...

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

//In TheServer
protected void StartTheServer()
{
   base.Start();
}

Und für das, was es wert ist, würde ich empfehlen, mit:

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

Oder vielleicht noch mehr Generika, Server. Hängt davon ab, welche Methoden Sie auf serv nennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top