强制执行函数调用的顺序?

gda*_*004 5 c++ design-patterns

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

IE

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();
Run Code Online (Sandbox Code Playgroud)

这样我就可以更好地理解如何设计我的类来强制某人正确使用我的类.

Luc*_*ore 13

您正在寻找模板方法模式:

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() {};
};
Run Code Online (Sandbox Code Playgroud)

你基本上强制扩展类来实现所有中间步骤,但你保留它们- protected或者private记录这个 - 并且只有调用runAlgorithm(),它将较小的部分连接在一起.

  • 通常,您应该将您的公共函数保持为非虚函数,并通过受保护的虚函数实现类的多态行为.除了上面的订单执行,它还允许您检查前/后条件并在"步骤"之间执行公共代码块. (2认同)

Mat*_* M. 5

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

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

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

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

class Strategy {
public:
    virtual void do1() = 0;
    virtual void do2() = 0;
};

void doit(Strategy& s) {
    s.do1();
    s.do2();
}
Run Code Online (Sandbox Code Playgroud)

从网站:

策略就像模板方法,只是它的粒度不同。[Coplien,C++ 报告,3 月 96 日,第 88 页]

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

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

我建议您熟悉它们。