Как вызвать метод производного класса из базового класса? - программирование
Подтвердить что ты не робот

Как вызвать метод производного класса из базового класса?

Я прочитал несколько подобных вопросов об этом, но никто, кажется, не решает проблему, с которой я столкнулся. Типичным ответом является использование в качестве производного класса, но я не могу, так как не знаю тип производного класса.

Вот мой пример:

class WireLessDevice { // base class
    void websocket.parsemessage(); // inserts data into the wireless device object
}

class WiFi : WireLessDevice { // derived class
    GPSLoc Loc;
}

Беспроводное устройство также может быть создано для создания устройств Bluetooth, Wi-Max, Cellular и т.д., и поэтому я не знаю, какой тип беспроводного устройства будет принимать данные.

Когда GPS-пакет принимается на websocket в базовом классе, мне нужно обновить местоположение производного устройства.

Я думал, возможно, отправив сообщение через очередь или создав обработчик событий и отправив местоположение в аргументы события, но они кажутся немного неуклюжими, когда данные остаются внутри класса.

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

4b9b3361

Ответ 1

Правильный способ заключается в добавлении метода DoSomeMagic() в базовый класс, с реализацией по умолчанию или абстрактными. Полученный класс должен чем-то переопределить его, чтобы сделать свою магию.

Что-то вроде этого может быть:

public class WireLessDevice
{ // base class
    protected virtual void ParseMessage()
    {
        // Do common stuff in here
    }
}

public class WiFi : WireLessDevice
{ // derived class
    override void ParseMessage()
    {
        base.ParseMessage();//Call this if you need some operations from base impl.
        DoGPSStuff();
    }
    private void DoGPSStuff()
    {
        //some gps stuff
    }
    GPSLoc Loc;
}

Ответ 2

Виртуальные методы будут хорошим решением. Вы создаете метод ParseMessage в базовом классе, который обрабатывает все элементы, общие для каждого производного типа, а затем переопределяет для определенных устройств.

Чтобы все еще иметь возможность обрабатывать другие типы сообщений, вам необходимо вызвать base.ParseMessage, если это необходимо:

class WireLessDevice
{
    protected virtual bool ParseMessage(byte[] message)
    {
        // Inspect message and handle the known ones
        return true; // Only if message parsed, otherwise false
    }
}

class WiFi : WireLessDevice
{
    GPSLoc Loc;

    protected override bool ParseMessage(byte[] message)      
    {
        bool messageParsed = base.ParseMessage(message)
        if (!messageParsed)
        {
            // Handle device specific message with GPSLoc
            Loc = ...
        }
        else
        {
            return false;
        }
    }
}

Если ваш базовый класс не обрабатывает какие-либо другие сообщения, код может быть проще (и с помощью abstract). Однако в этом случае я бы подумал о переносе кода веб-сокета на производный класс.