Domanda

Beh, sto cercando di riutilizzare una parte del codice C #. È una classe astratta con server UDP, che può essere vista qui:

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

Ho creato una classe derivata come questa:

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

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

E nella mia app ho creato un'istanza della classe derivata come questa:

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

Ma ho degli errori e non capisco davvero perché. Per favore aiutate.

  1. "TheProject.TheServer" no contiene un costruttore che richiede '1' argomenti
  2. 'TheProject.UDPServer.Start ()' è inaccessibile a causa della sua protezione livello
  3. "TheProject.UDPServer" non contiene un costruttore che richiede Argomenti "0"
È stato utile?

Soluzione

I costruttori non vengono ereditati in C #. Dovrai incatenarli manualmente:

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

Inoltre, se Start è protetto, dovrai creare una sorta di metodo pubblico che lo chiama:

public void StartServer()
{
    Start();
}

Altri suggerimenti

La tua classe derivata deve aggiungere un costruttore a un parametro e delegarlo alla classe base:

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

Inoltre, il metodo Start è protetto. Avrai bisogno del tuo:

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

Questi errori in realtà hanno cause abbastanza semplici:

  1. Non hai definito un costruttore nella tua classe derivata ( TheServer ). I costruttori (a differenza dei metodi ovviamente) non vengono ereditati automaticamente, quindi dovrai dichiarare i costruttori che corrispondono a quelli della classe genitore e collegarli insieme usando qualcosa del tipo:

    public TheServer(int port) : base(port)
    {
        // Your code here.
    }
    
    public TheServer() : base()
    {
        // Your code here.
    }
    
  2. Il metodo Start è dichiarato come protetto nella classe base ( UDPServer ). O modifica il modificatore di accesso nella classe di base in public o trova un modo per chiamare il metodo dalla classe derivata quando è necessario (quest'ultimo deve essere stato progettato dallo scrittore di UDPServer ).

  3. Stesso motivo di 1, tranne per il fatto che si riferisce al costruttore predefinito (senza parametri).

Spero che sia d'aiuto.

Non hai definito un costruttore TheServer con un argomento, quindi non puoi chiamare TheServer (20501); non hai definito un costruttore di argomenti zero per UDPServer ma ne hai definito uno con un argomento. I tuoi due metodi in TheServer sono protetti, quindi l'errore su # 2.

  1. e 3.

Aggiungi un costruttore a TheServer che chiama il costruttore di base (di UDPServer); qualcosa del genere:

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

2 Scopri il metodo Start su UDPServer: è protetto. Ciò significa che solo le sottoclassi di quella classe possono chiamarla.

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

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

Dovrai pubblicare il codice nella tua classe Abstract ma a un'ipotesi completa,

Hai un ctor nella tua classe UDPServer che non hai implementato nella tua classe TheServer ... Hai bisogno di qualcosa come ...

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

E hai anche dimenticato di sovrascrivere il metodo Start () nella tua classe TheServer ma è contrassegnato come privato nella classe sottostante ... La tua classe sottostante dovrebbe avere qualcosa come ...

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

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

E, per quello che vale, ti consiglio di usare:

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

O, forse ancora più generico, Server. Dipende dai metodi che devi chiamare sul servizio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top