0

假设我有以下 C++ 代码

class ControlAlgorithm {

public:
    virtual void update() = 0;
    virtual void enable() = 0;
    virtual void disable() = 0;
};

class Algorithm_A : public ControlAlgorithm {

public:
    void update();
    void enable();
    void disable();
};

class Algorithm_B : public ControlAlgorithm {

public:
    void update();
    void enable();
    void disable();
};

Algorithm_A algorithm_A;
Algorithm_B algorithm_B;
ControlAlgorithm *algorithm;

假设我想根据一些外部事件在运行时algorithm_A和运行时之间切换algorithm_B(基本上我将实现状态设计模式)。所以algorithm指针指向algorithm_Aalgorithm_B对象。我的问题是是否有任何方法可以实现在运行时动态切换算法的能力,而无需公共接口中的虚拟方法,例如奇怪的重复模板模式?

4

1 回答 1

1

您可以使用组合而不是继承。例如,如下所示。

#include <iostream>
#include <functional>

struct control_algorithm {
    const std::function<void()> update;
    const std::function<void()> enable;
    const std::function<void()> edit;
};

control_algorithm make_algorithm_A() {
    return {
        []() { std::cout << "update A\n"; },
        []() { std::cout << "enable A\n"; },
        []() { std::cout << "edit A\n"; },
    };
}

control_algorithm make_algorithm_B() {
    return {
        []() { std::cout << "update B\n"; },
        []() { std::cout << "enable B\n"; },
        []() { std::cout << "edit B\n"; },
    };
}

int main()
{
    auto algorithm_A = make_algorithm_A();
    auto algorithm_B = make_algorithm_B();
    auto control = algorithm_A;
    //auto control = algorithm_B;
}
于 2021-09-13T15:29:24.827 回答