Базовый класс C ++ в качестве прокси - PullRequest
0 голосов
/ 07 марта 2020

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

По сути, у меня есть класс, который я хочу расширить с помощью дополнительных функций. Однако точный способ реализации логики c для этого класса варьируется в зависимости от ситуации в программе (аналогично шаблону разработки политики).

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

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

Ниже я привел пример того, чем я сейчас занимаюсь:

// Interface for workers
class Worker {
public:
    virtual void x() = 0;
    virtual void y() = 0;
    virtual void z() = 0;
};

// This provides the actual implementation
class WorkerChild : public Worker {
public:
    void x() { /*Do thing*/ }
    void y() { /*Do thing*/ }
    void z() { /*Do thing*/ }
};

Worker* getAppropriateWorker() {
    // Some logic here to determine the appropriate type of worker to use
    return nullptr; // Wouldn't actually be nullptr in practice
}

// This acts as something that is easy to instantiate and extend without 
class MyClass {
private:
    Worker* _worker;

public:
    MyClass()
        : _worker(getAppropriateWorker()) {
    }

    void x() { _worker->x(); }
    void y() { _worker->y(); }
    void z() { _worker->z(); }

};

class MyExtendedClass : public MyClass {
public:
    void doAThing() {
        x();
        y();
    }

    void doAnotherThing() {
        z();
        y();
        x();
    }

};

Как вы можете видеть, существует много переопределений интерфейса, и каждая функция в MyClass просто выполняет простой вызов указателя - logi c не дублируется, но все еще медленен и раздражает.

Есть ли в C ++ лучший способ справиться с этим?

Спасибо за любую помощь.

...