Question

Eh bien, j'essaie de réutiliser une partie du code C #. C'est une classe abstraite avec serveur UDP, que l'on peut voir ici:

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

J'ai créé une classe dérivée comme celle-ci:

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

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

Et dans mon application, j'ai créé une instance de la classe dérivée comme ceci:

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

Mais j'ai des erreurs et je ne comprends pas vraiment pourquoi. S'il vous plaît aider.

  1. 'TheProject.TheServer' ne fonctionne pas contient un constructeur qui prend '1' arguments
  2. 'TheProject.UDPServer.Start ()' est inaccessible en raison de sa protection niveau
  3. 'TheProject.UDPServer' fait ne pas contenir un constructeur qui prend Arguments '0'
Était-ce utile?

La solution

Les constructeurs ne sont pas hérités en C #. Vous devrez les chaîner manuellement:

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

De plus, si Start est protégé, vous devrez créer une sorte de méthode publique qui l'appelle:

public void StartServer()
{
    Start();
}

Autres conseils

Votre classe dérivée doit ajouter un constructeur à un paramètre et le déléguer à la classe de base:

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

De plus, la méthode Start est protégée. Vous aurez besoin de votre propre:

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

Ces erreurs ont en réalité des causes assez simples:

  1. Vous n'avez pas défini de constructeur dans votre classe dérivée ( TheServer ). Les constructeurs (contrairement aux méthodes bien sûr) ne sont pas automatiquement hérités. Vous devez donc déclarer les constructeurs qui correspondent à ceux de la classe parente et les chaîner en utilisant quelque chose comme:

    public TheServer(int port) : base(port)
    {
        // Your code here.
    }
    
    public TheServer() : base()
    {
        // Your code here.
    }
    
  2. La méthode Start est déclarée comme protected dans la classe de base ( UDPServer ). Modifiez le modificateur d'accès de la classe de base en public ou trouvez un moyen d'appeler la méthode à partir de la classe dérivée lorsque vous en aurez besoin (cette dernière doit avoir été voulue par l'auteur de . UDPServer ).

  3. Même raison que 1, sauf qu'il s'agit du constructeur par défaut (sans paramètre).

L’espoir que cela aide.

Vous n'avez pas défini de constructeur TheServer avec un argument, vous ne pouvez donc pas appeler TheServer (20501); vous n'avez pas défini de constructeur à zéro argument pour UDPServer, mais vous en avez défini un avec un seul argument. Vos deux méthodes dans TheServer sont protégées, d’où l’erreur sur # 2.

  1. et 3.

Ajoutez un constructeur à TheServer qui appelle le constructeur de base (de UDPServer); quelque chose comme ceci:

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

2 Découvrez la méthode Démarrer sur UDPServer: il est protégé. Cela signifie que seules les sous-classes de cette classe peuvent l'appeler.

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

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

Vous aurez besoin de poster le code dans votre classe abstraite, mais à la conjecture complète,

Vous avez un ctor dans votre classe UDPServer que vous n'avez pas implémenté dans votre classe TheServer ... Vous avez besoin de quelque chose comme ...

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

Et vous avez également oublié de remplacer la méthode Start () dans votre classe TheServer. mais sa marque comme privé dans la classe sous-jacente ... Votre classe sous-jacente devrait avoir quelque chose comme ...

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

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

Et pour ce que ça vaut, je vous recommande d'utiliser:

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

Ou peut-être même plus générique, Server. Dépend des méthodes à utiliser pour faire appel à serv.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top