如何在运行时更改对象的行为?(使用C++)
我将举一个简单的例子.我有一个Operator包含方法的类operate.我们假设它看起来像这样:
double operate(double a, double b){
return 0.0;
}
Run Code Online (Sandbox Code Playgroud)
用户将给予一定的输入值a和b,而会选择执行什么操作让我们说,他可以选择计算加法或乘法.鉴于它的输入,我被允许做的只是实例化Operator和调用operate(a, b),这正是我之前提到的.
计算乘法或加法的方法将在某处实现(不知道在哪里).
总之,我必须根据用户的输入更改Operator对象的行为.
这样做的标准模式是使外部类具有指向"实现"类的指针.
// derive multiple implementations from this:
class Implementation
{
virtual ~Implementation() {} // probably essential!
virtual void foo() = 0;
};
class Switcheroo
{
Implementation *impl_;
public:
// constructor, destructor, copy constructor, assignment
// must all be properly defined (any that you can't define,
// make private)
void foo()
{
impl_->foo();
}
};
Run Code Online (Sandbox Code Playgroud)
通过将所有成员函数转发Switcheroo给impl_成员,您可以在需要时切换到不同的实现.
这种模式有多种名称:Pimpl("私有实现"的缩写),智能参考(与智能指针相反,由于前导成员功能),它与代理和桥接模式有一些共同之处.
我只是把它作为琐事提到,不能再多说一点,但我们走了......
警告危险!!!
我认为,我所看到的一个愚蠢的伎俩叫做抓紧,但这只是为了真正的愚蠢.基本上你将virtualtable指针交换到另一个类的指针,它可以工作,但它理论上可以破坏世界或导致一些其他未定义的行为:)
不管怎么说,只使用动态分类和kosher C++,但作为一个实验,上面是有趣的...