强制实施函数调用的顺序

enforce order of function calls?

本文关键字:顺序 函数调用      更新时间:2023-10-16

假设我有一个抽象的基类,我想有一个必须由派生类实现的纯虚拟方法,但我想确保派生方法以特定顺序调用函数,我能做些什么来强制执行它?

base class
virtual void doABC()=0;
virtual void A()=0;
virtual void B()=0;
virtual void C()=0;

// must call ABC in the correct order 
derived class public base
void doABC();

这只是为了让我对如何设计我的类以强制某人正确使用我的类有更好的理解。

您正在寻找模板方法模式

http://en.wikipedia.org/wiki/Template_method_pattern

大致如下:

class BaseAlgorithm
{
protected:
    virtual void firstStep() = 0;
    virtual void secondStep() = 0;
    virtual void finalStep() = 0;
public:
    void runAlgorithm()
    {
        firstStep();
        secondStep();
        finalStep();
    }
};
class ConcreteAlgorithm : BaseAlgorithm
{
    virtual void firstStep() {};
    virtual void secondStep() {};
    virtual void finalStep() {};
};

基本上强制扩展类来实现所有中间步骤,但你把它们保持protectedprivate - 记录这个 - 并且只调用runAlgorithm(),它将较小的部分联系在一起。

实际上有两种特定方法,具体取决于您是使用继承还是参数化。

如果你有继承,它是Template Method模式:

class Base {
public:
    void doit() {
        this->do1();
        this->do2();
    }
private:
    virtual void do1() = 0;
    virtual void do2() = 0;
};

如果你使用参数化,它是Strategy模式:

class Strategy {
public:
    virtual void do1() = 0;
    virtual void do2() = 0;
};
void doit(Strategy& s) {
    s.do1();
    s.do2();
}

从网站:

策略类似于模板方法,只是在粒度上。[科普利安,C++报告,96年3月,第88页]

模板方法使用继承来改变算法的一部分。策略使用委托来改变整个算法。[政府,第330页]

策略修改单个对象的逻辑。模板方法修改整个类的逻辑。 [盛大,p383]

我建议您熟悉它们。

最简单的答案可能是,如果您从 doABC() 中删除虚拟,以便它不能由子类派生。 以正确的顺序调用 doABC() 中的虚拟方法。