我有一个名为
的回调函数MyCallBack(int type)
我有3个B,C和D类,它们来自A,具有常用的方法名称 目前我的代码是这样的
MyCallBack(int type){
if(type == 1 ){
B b;
b.perform();
}else if(type==2) {
C c;
c.perform();
}else if(type ==3){
D d;
d.perform();
}
有没有办法可以减少像
这样的代码MyCallBack(int type){
Common object(type);
object.perform();
}
答案 0 :(得分:3)
基本上,你需要的是多态性。
您的所有课程B
,C
,D
应来自抽象课程,并使用纯虚拟方法SuperBase
说perform()
。
您的代码应该只使用指向SuperBase
的指针,该指针包含实际具体类对象的地址
一旦你有了这个,根据被指向的对象的实际类型,将调用适当的类的方法。
这种方法的优点是没有硬编码类型检查&使用Open Closed principle进行松散耦合设计的灵活性。
答案 1 :(得分:2)
MyCallback(int type) {
static A *ptrs[] = { new B, new C, new D};
ptrs[type-1]->perform();
}
编辑:以防您不知道,为了使其正常工作,perform
需要在A
中声明(可能是纯粹的)虚拟虚拟函数,并在每个虚拟函数中定义B
,C
和D
。您需要确保函数的整个签名,而不仅仅是名称,在类之间是相同的。
答案 2 :(得分:1)
interface怎么样?
class A
{
public:
virtual void perform() = 0;
};
class B : public A
{
public:
void perform() { ... }
};
// Same for C, and D
所以你的回调就像:
MyCallBack(A& performer)
{
performer.perform();
}
如果您无法更改回调的签名,abstract factory pattern:
怎么样?function A* AFactory(int type)
{
switch(type)
{
case 1: return new B(); // Assuming B, C, D all derive from A
case 2: return new C();
case 3: return new D();
default: return nullptr; // nullptr is a c++11 thing. Use NULL, if you're still on C++03
}
}
然后是回调......
MyCallBack(int type)
{
std::unique_ptr<A> obj(AFactory(type)); // this will automatically release the memory once it falls out of scope
obj->perform();
}
答案 3 :(得分:-1)
你应该创建Object Factory或者只是静态(全局)方法将指针(或者引用,可能)返回到基类型,但是包含派生类型的对象。
CBase* CreateObjectBasedOnType(int type)
{
// check for type and return appriopriate derived object
}
MyCallBack(int type)
{
CreateObjectBasedOnType(type)->perform();
}
请注意,您要调用的方法应该是虚拟的。
更好的方法可以使用模板
template<typename T>
MyCallBack()
{
T Obj;
Obj.perform();
}