7 Stimmen

Abstrakte Klasse, Konstruktoren und Co

Nun, ich versuche, einen Teil des C#-Codes wiederzuverwenden. Es ist eine abstrakte Klasse mit UDP-Server, die hier gesehen werden kann:

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

Ich habe eine abgeleitete Klasse wie diese erstellt:

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

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

Und in meiner Anwendung habe ich eine Instanz der abgeleiteten Klasse wie folgt erstellt:

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

Aber ich habe Fehler, und ich verstehe nicht wirklich, warum. Bitte helfen Sie mir.

  1. DasProjekt.DerServer' enthält keine einen Konstruktor, der '1' nimmt Argumente
  2. 'TheProject.UDPServer.Start()' ist unzugänglich aufgrund der Schutzstufe Ebene
  3. TheProject.UDPServer' enthält enthält keinen Konstruktor, der 0' Argumente

13voto

Tamas Czinege Punkte 114595

Konstruktoren werden in C# nicht vererbt. Sie müssen sie manuell verketten:

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

Wenn Start geschützt ist, müssen Sie außerdem eine öffentliche Methode erstellen, die diese aufruft:

public void StartServer()
{
    Start();
}

8voto

John Saunders Punkte 159011

Ihre abgeleitete Klasse muss einen Ein-Parameter-Konstruktor hinzufügen und ihn an die Basisklasse delegieren:

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

Auch die Start Methode geschützt ist. Sie brauchen Ihre eigene:

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

2voto

Noldorin Punkte 138548

Die Ursachen für diese Fehler sind eigentlich recht simpel:

  1. Sie haben keinen Konstruktor in Ihrer abgeleiteten Klasse definiert ( TheServer ). Konstruktoren (im Gegensatz zu Methoden natürlich) werden nicht automatisch vererbt, also müssen Sie Konstruktoren deklarieren, die mit denen der übergeordneten Klasse übereinstimmen, und sie mit etwas wie:

    public TheServer(int port) : base(port)
    {
        // Your code here.
    }
    
    public TheServer() : base()
    {
        // Your code here.
    }
  2. En Start Methode wird deklariert als protected in der Basis ( UDPServer ) Klasse. Entweder ändern Sie den Zugriffsmodifikator in der Basisklasse in public oder finden Sie einen Weg, die Methode von der abgeleiteten Klasse aus aufzurufen, wenn Sie sie brauchen (letzteres muss vom Autor von UDPServer ).

  3. Gleicher Grund wie 1, außer dass sich dies auf den Standardkonstruktor (ohne Parameter) bezieht.

Ich hoffe, das hilft.

0voto

Otávio Décio Punkte 72052

Sie haben keinen TheServer-Konstruktor mit einem Argument definiert, also können Sie TheServer(20501) nicht aufrufen; Sie haben keinen Konstruktor mit null Argumenten für UDPServer definiert, aber einen mit einem Argument. Ihre beiden Methoden in TheServer sind geschützt, daher der Fehler bei #2.

0voto

Kurt Schelfthout Punkte 8711
  1. und 3.

Fügen Sie einen Konstruktor zu TheServer hinzu, der den Basiskonstruktor (von UDPServer) aufruft; etwas wie dies:

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

2 Überprüfen Sie die Methode Start auf UDPServer: Sie ist geschützt. Das bedeutet, dass nur Unterklassen dieser Klasse sie aufrufen können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X