Вопрос

Ну, я пытаюсь повторно использовать часть кода на C #.Это абстрактный класс с UDP-сервером, который можно увидеть здесь:

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

Я создал производный класс, подобный этому:

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

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

И в моем приложении я создал экземпляр производного класса следующим образом:

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

Но у меня есть ошибки, и я действительно не понимаю, почему.Пожалуйста, помогите.

  1. 'TheProject.Сервер' не содержит конструктор, который принимает '1' аргументы
  2. 'Проект.UDPServer.Начать () - это недоступным из-за его охрану уровень
  3. 'TheProject.UDPServer' не содержит конструктора, который принимает аргументы '0'
Это было полезно?

Решение

Конструкторы не наследуются в C #. Вам придется связать их вручную:

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

Кроме того, если Start защищен, вам придется создать какой-то публичный метод, который вызывает его:

public void StartServer()
{
    Start();
}

Другие советы

Ваш производный класс должен добавить конструктор с одним параметром и делегировать его базовому классу:

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

Кроме того, метод Start защищен. Вам понадобится свой собственный:

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

Эти ошибки на самом деле имеют довольно простые причины:

<Ол>
  • Вы не определили конструктор в своем производном классе ( TheServer ). Конструкторы (в отличие от методов, разумеется) не наследуются автоматически, поэтому вам нужно объявить конструкторы, совпадающие с вами, в родительском классе и объединить их в цепочку, используя что-то вроде:

    public TheServer(int port) : base(port)
    {
        // Your code here.
    }
    
    public TheServer() : base()
    {
        // Your code here.
    }
    
  • Метод Start объявлен как protected в базовом ( UDPServer ) классе. Либо измените модификатор доступа в базовом классе на public , либо найдите способ вызова метода из производного класса, когда это необходимо (последний должен был быть создан автором UDPServer ).

  • Та же причина, что и 1, за исключением того, что она ссылается на конструктор по умолчанию (без параметров).
  • Надеюсь, это поможет.

    Вы не определили конструктор TheServer с одним аргументом, поэтому вы не можете вызвать TheServer (20501); вы не определили конструктор с нулевыми аргументами для UDPServer, но вы определили один с одним аргументом. Два ваших метода в TheServer защищены, поэтому ошибка # 2.

    1. и 3.

    Добавьте конструктор на сервер, который вызывает базовый конструктор (UDPServer);что - то вроде этого:

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

    2 Проверьте метод Start на UDPServer:он защищен.Это означает, что только подклассы этого класса могут вызывать его.

    public class TheServer 
    {   
        public TheServer():base(port) {
        }    
    }
    
    var myServer = new TheServer(1337).Brings().All().The().Boys().to().The().Yard()
    

    Вам нужно будет опубликовать код в своем классе Abstract, но по полной причине,

    В вашем классе UDPServer есть ctor , который вы не реализовали в своем классе TheServer ... Вам нужно что-то вроде ...

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

    И вы также забыли переопределить метод Start () в своем классе TheServer но он помечен как закрытый в базовом классе ... Ваш базовый класс должен иметь что-то вроде ...

    //In UDPServer
    protected void Start()
    {
       //Code to start
    }
    
    //In TheServer
    protected void StartTheServer()
    {
       base.Start();
    }
    

    И, для чего бы это ни стоило, я бы порекомендовал использовать:

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

    Или, может быть, даже более общий, сервер. Зависит от того, какие методы нужно вызывать на серв.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top