Pregunta

Bueno, estoy intentando reutilizar una parte del código C #. Es una clase abstracta con servidor UDP, que se puede ver aquí:

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

He creado una clase derivada como esta:

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

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

Y en mi aplicación he creado una instancia de la clase derivada como esta:

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

Pero tengo errores y realmente no entiendo por qué. Por favor ayuda.

  1. 'TheProject.TheServer' no Contiene un constructor que lleva '1'. argumentos
  2. 'TheProject.UDPServer.Start ()' es Inaccesible debido a su protección. nivel
  3. 'TheProject.UDPServer' hace No contiene un constructor que lleva '0' argumentos
¿Fue útil?

Solución

Los constructores no se heredan en C #. Tendrás que encadenarlos manualmente:

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

Además, si Start está protegido, tendrá que crear algún tipo de método público que lo llame:

public void StartServer()
{
    Start();
}

Otros consejos

Su clase derivada necesita agregar un constructor de un solo parámetro y delegarlo a la clase base:

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

Además, el método Start está protegido. Necesitarás el tuyo:

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

Estos errores en realidad tienen causas bastante directas:

  1. No ha definido un constructor en su clase derivada ( TheServer ). Los constructores (a diferencia de los métodos, por supuesto) no se heredan automáticamente, por lo que deberá declarar constructores que coincidan con los de la clase principal y encadenarlos usando algo como:

    public TheServer(int port) : base(port)
    {
        // Your code here.
    }
    
    public TheServer() : base()
    {
        // Your code here.
    }
    
  2. El método Start se declara como protegido en la clase base ( UDPServer ). Cambie el modificador de acceso en la clase base a public , o encuentre una manera de llamar al método desde la clase derivada cuando lo necesite (este último debe haber sido diseñado por el escritor de UDPServer ).

  3. La misma razón que 1, excepto que se refiere al constructor predeterminado (sin parámetros).

Espero que ayude.

No definió un constructor TheServer con un argumento, por lo que no puede llamar a TheServer (20501); no definió un constructor de argumentos cero para UDPServer pero definió uno con un argumento. Sus dos métodos en TheServer están protegidos, de ahí el error en el n. ° 2.

  1. y 3.

Agregue un constructor a TheServer que llame al constructor base (de UDPServer); algo como esto:

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

2 Vea el método Iniciar en UDPServer: está protegido. Esto significa que solo las subclases de esa clase pueden llamarlo.

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

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

Tendrá que publicar el código en su clase de resumen, pero en una conjetura completa,

Tienes un ctor en tu clase UDPServer que no has implementado en tu clase TheServer ... Necesitas algo como ...

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

Y también se ha olvidado de anular el método Start () en su clase TheServer pero está marcado como privado en la clase subyacente ... Tu clase subyacente debería tener algo como ...

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

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

Y, para lo que valga, recomiendo usar:

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

O, quizás aún más genérico, Servidor. Depende de los métodos que necesite llamar en serv.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top