强制实施函数调用的顺序
enforce order of function calls?
假设我有一个抽象的基类,我想有一个必须由派生类实现的纯虚拟方法,但我想确保派生方法以特定顺序调用函数,我能做些什么来强制执行它?
即
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() {};
};
你基本上强制扩展类来实现所有中间步骤,但你把它们保持protected
或private
- 记录这个 - 并且只调用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() 中的虚拟方法。
相关文章:
- 函数调用中参数的顺序重要吗
- x64 函数调用参数推送/移动顺序 (MSVC)
- COUT 内部函数调用的顺序
- 构造函数的初始值设定项列表中的函数调用是否按顺序排序?
- C++:cout 和函数调用之间的计算顺序
- 当指定初始化程序的顺序和字段声明不一致时,clang可以删除函数调用
- 函数调用的顺序
- 构造函数和析构函数调用的顺序
- 析构函数调用的顺序C++
- 在虚拟继承中构造函数调用的顺序是什么
- 可变模板扩展中函数调用的顺序
- 如何将 etrace 与动态库结合使用,以按时间顺序跟踪 C++ 中的函数调用
- STL 中构造函数调用的顺序
- 此代码是否依赖于函数调用顺序未定义的行为
- 强制实施函数调用的顺序
- 函数调用的顺序
- 使用继承时构造函数/析构函数调用的顺序
- 链式静态函数调用之间的参数求值顺序
- 在块程序结束时析构函数调用的顺序
- 无法理解析构函数调用顺序