假设我有一个抽象基类,我希望有一个必须由派生类实现的纯虚方法,但我想确保派生方法以特定顺序调用函数我该怎么做才能强制执行它?
即
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();
这样我就可以更好地理解如何设计我的类来强制某人正确使用我的类。
答案 0 :(得分: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() {};
};
你基本上强制扩展类来实现所有中间步骤,但你保留它们protected
或private
- 记录这个 - 并且只调用runAlgorithm()
,它将较小的部分绑在一起。< / p>
答案 1 :(得分:4)
实际上有两种特殊的方式,取决于你是继承还是参数化。
如果你继承,那就是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 ++ Report,Mar 96,p88]
模板方法使用继承来改变算法的一部分。 策略使用委派来改变整个算法。 [GoF,p330]
策略修改单个对象的逻辑。 模板方法修改整个类的逻辑。 [大,p383]
我建议你熟悉它们。
答案 2 :(得分:1)
最简单的答案可能是,如果您从doABC()中删除虚拟,那么它不能由子类派生。以正确的顺序调用doABC()中的虚方法。