Абстрактный класс, конструкторы и Co - PullRequest
7 голосов
/ 01 мая 2009

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

http://clutch -inc.com / блог /? Р = 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.TheServer» не содержит конструктор, который принимает '1' Аргументы
  2. TheProject.UDPServer.Start () недоступен из-за его защиты уровень
  3. 'TheProject.UDPServer' делает не содержит конструктор, который принимает '0' аргументы

Ответы [ 8 ]

13 голосов
/ 01 мая 2009

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

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

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

public void StartServer()
{
    Start();
}
8 голосов
/ 01 мая 2009

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

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

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

public void StartMe(){base.Start();}
2 голосов
/ 01 мая 2009

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

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

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

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

Надеюсь, это поможет.

0 голосов
/ 01 мая 2009

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

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

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

0 голосов
/ 01 мая 2009

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

У вас есть ctor в вашем классе UDPServer, который вы не реализовали в своем классе 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();
}
0 голосов
/ 01 мая 2009
public class TheServer 
{   
    public TheServer():base(port) {
    }    
}

var myServer = new TheServer(1337).Brings().All().The().Boys().to().The().Yard()
0 голосов
/ 01 мая 2009
  1. и 3.

Добавить конструктор в TheServer, который вызывает базовый конструктор (из UDPServer); как то так:

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

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

0 голосов
/ 01 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...