C ++, как иметь отдельные версии одного и того же метода? - PullRequest
0 голосов
/ 04 июля 2018

Извините, если я не знаю правильного слова для того, чего я пытаюсь достичь.

По сути, у меня есть объект обработчика событий, который имеет только один член. Участник является объектом Stage.

Когда обработчик событий получает событие, я хочу, чтобы он просто использовал объект stage для вызова соответствующего метода. Например:

Event event; //this event is not part of my code, but rather the library I'm using.

Stage s;                    // my custom class object

EventHandler event_handler; //also my custom class object
event_handler.stage = &s;

if(event == SHUTDOWN) {
    event_handler.stage->handle_shutdown();
}

Итак, что я пытаюсь сделать, так это то, что со временем у моей программы будут отдельные области действия, и я хочу, чтобы у каждой области был доступ к обработчику событий, чтобы они могли делать что-то вроде:

void some_other_scope(EventHandler* eh) {
    Stage* some_new_stage = new Stage(...);
    eh->stage = some_new_stage;
}

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

Итак, я хочу перегрузить метод handle_shutdown, чтобы его можно было реализовать по-разному. Я знаю, как работает базовая перегрузка, это можно сделать, указав разные параметры, но есть ли способ получить разные определения одного и того же метода класса на основе файла, в котором был создан объект?

Я надеялся получить несколько файлов, каждый с собственной функцией some_other_scope (), и каждый файл может переопределять метод handle_shutdown для выполнения различных задач в зависимости от потребностей этого файла.

Я уверен, что есть способ сделать то, что я хочу, я просто не знаю, какие слова использовать.

1 Ответ

0 голосов
/ 04 июля 2018

Кажется, вы хотите использовать полиморфизм:

class IStage
{
public:
    virtual ~IStage() = default;
    virtual void handle_shutdown() = 0;
    // ...
};

class Stage1 : public IStage
{
public:
    void handle_shutdown() override { /*Implementation1*/ }
    // ...
};

class Stage2 : public IStage
{
public:
    void handle_shutdown() override { /*Implementation1*/ }
    // ...
};

А потом

struct EventHandler
{
    std::unique_ptr<IStage> stage;
    // ...
};

EventHandler event_handler;
event_handler.stage = std::make_unique<Stage1>();

if (event == SHUTDOWN) {
    event_handler.stage->handle_shutdown();
}

// Later
event_handler.stage = std::make_unique<Stage2>();

if (event == SHUTDOWN) {
    event_handler.stage->handle_shutdown();
}
...