Абстрактный класс, конструкторы и соавторы
-
03-07-2019 - |
Вопрос
Ну, я пытаюсь повторно использовать часть кода на 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();
Но у меня есть ошибки, и я действительно не понимаю, почему.Пожалуйста, помогите.
- 'TheProject.Сервер' не содержит конструктор, который принимает '1' аргументы
- 'Проект.UDPServer.Начать () - это недоступным из-за его охрану уровень
- '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 код>).
Надеюсь, это поможет.
Вы не определили конструктор TheServer с одним аргументом, поэтому вы не можете вызвать TheServer (20501); вы не определили конструктор с нулевыми аргументами для UDPServer, но вы определили один с одним аргументом. Два ваших метода в TheServer защищены, поэтому ошибка # 2.
- и 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();
Или, может быть, даже более общий, сервер. Зависит от того, какие методы нужно вызывать на серв.