Abstrakte Klasse, Konstruktoren und Co

7

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

Ссылка

Ich habe eine abgeleitete Klasse wie folgt erstellt:

%Vor%

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

%Vor%

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

  1. 'TheProject.TheServer' nicht enthält einen Konstruktor, der '1' akzeptiert Argumente
  2. 'TheProject.UDPServer.Start ()' ist wegen seines Schutzes unzugänglich Ebene
  3. 'TheProject.UDPServer' tut das nicht enthalten einen Konstruktor, der dauert '0' Argumente
undsoft 01.05.2009, 13:00
quelle

8 Antworten

13

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

%Vor%

Wenn Start ebenfalls geschützt ist, müssen Sie eine öffentliche Methode erstellen, die es aufruft:

%Vor%     
Tamas Czinege 01.05.2009, 13:05
quelle
8

Ihre abgeleitete Klasse muss einen Konstruktor mit einem Parameter hinzufügen und an die Basisklasse delegieren:

%Vor%

Außerdem ist die Methode Start geschützt. Sie werden Ihre eigenen brauchen:

%Vor%     
John Saunders 01.05.2009 13:04
quelle
2

Diese Fehler haben eigentlich recht einfache Ursachen:

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

    %Vor%
  2. Die Methode Start wird in der Klasse base ( protected ) als UDPServer deklariert. Ändern Sie den Zugriffsmodifikator in der Basisklasse in public , oder finden Sie einen Weg, die Methode bei Bedarf von der abgeleiteten Klasse aufzurufen (letzterer muss vom Autor von UDPServer gemeint sein).

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

Ich hoffe, das hilft.

    
Noldorin 01.05.2009 13:08
quelle
0

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

    
Otávio Décio 01.05.2009 13:03
quelle
0
  1. und 3.

Fügen Sie dem Server einen Konstruktor hinzu, der den Basiskonstruktor (von UDPServer) aufruft. etwas wie das:

%Vor%

2 Sehen Sie sich die Methode Start am UDPServer an: Sie ist geschützt. Dies bedeutet, dass nur Unterklassen dieser Klasse sie aufrufen können.

    
Kurt Schelfthout 01.05.2009 13:05
quelle
0
%Vor%     
Chad Grant 01.05.2009 13:06
quelle
0

Sie müssen den Code in Ihrer Abstract-Klasse veröffentlichen, aber mit einer vollständigen Schätzung,

Sie haben eine ctor in Ihrer UDPServer-Klasse, die Sie nicht in Ihrer TheServer-Klasse implementiert haben ... Sie brauchen etwas wie ...

%Vor%

Sie haben auch vergessen, die Methode Start () in Ihrer Klasse TheServer zu überschreiben aber es ist als privat in der zugrunde liegenden Klasse markiert ... Ihre zugrunde liegende Klasse sollte etwas wie ...

haben %Vor%     
Eoin Campbell 01.05.2009 13:06
quelle
0

Und für was es sich lohnt, würde ich empfehlen:

%Vor%

Oder, vielleicht noch generischer, Server. Hängt davon ab, welche Methoden Sie zum Aufrufen von serv benötigen.

    
Elliot 01.05.2009 13:40
quelle

Tags und Links