6

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

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();

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

4

3 回答 3

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() {};
};

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

于 2012-05-15T13:37:40.203 回答
5

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

如果你有继承,它是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();
}

从网站:

策略模板方法类似,但粒度不同。[Coplien,C++ 报告,96 年 3 月,第 88 页]

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

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

我建议您熟悉它们。

于 2012-05-15T13:53:55.623 回答
1

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

于 2012-05-15T13:43:29.097 回答