gpt4 book ai didi

c++ - 在运行时选择方法实现

转载 作者:太空狗 更新时间:2023-10-29 23:17:44 24 4
gpt4 key购买 nike

我想在运行时通过选择一种方法来调用给定集合来配置对象的行为。考虑这个简单的例子:

class Parameter;

class Conf;

class Obj {
public:
Obj( const Conf &t ): t_( t ) {}
void f( Parameter *d );
void f1( Parameter *d );
void f2( Parameter *d );
typedef void ( Obj::*Fn )( Parameter *d );
private:
const Conf &t_;
};

class Conf {
public:
Obj::Fn f;
};

void Obj::f( Parameter *d ) {
( this->*t_.f )( d );
}

通过为给定的 Conf 对象更改 Conf::f,所有使用此配置的 Obj 对象的行为都会更改。

第一个问题:这是否类似于某种设计模式(好吧,这是一种方法指针策略……)?如果是这样,我是否应该考虑重新设计?

第二个问题:我想通过使用不同的参数类使其更加灵活。我已经通过将 Parameter 设为基类并在 fN 方法中进行类型转换来完成此操作,但这看起来不像是最终解决方案。有什么建议吗?

最佳答案

这让我想起了 State pattern ,考虑到当状态发生变化时,将在不同的对象上调用一个方法。如果您查看维基百科链接的 Java 示例,StateContext 对象具有 myState 属性,该属性将更改为不同的 State 对象以进行状态更改。

你可以做类似的事情,你的 Obj 类将有一个指针/引用指向一个对象,该对象实现了它实现的接口(interface)中指定的方法。然后可以通过内部逻辑或通过外部设置将内部指针/引用更改为指向不同的对象,然后调用的方法将不同。

这是一个简单的例子:

class Action
{
virtual void action() = 0;
}

class Action1 : public Action
{
virtual void action() { /* do something useful here */ }
};

class Action2 : public Action
{
virtual void action() { /* do something different here */ }
}

class Obj
{
public:
setAction(Action *a) {a_ = a;}
void action() {if(a_) a_->action();}
private:
Action *a_;
};

{
Action1 a1;
Action2 a2;
Obj o;
o.setAction(&a1);
o.action();

o.setAction(&a2);
o.action();
}

正如评论中提到的,这也与 Strategy 模式非常相似。

关于c++ - 在运行时选择方法实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16606629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com