将方法传递给方法并替换(几乎完全相同)重复代码

时间:2017-05-01 21:52:57

标签: c++ polymorphism virtual-functions

我有两个非常相似的方法。它们之间的主要区别在于它们在某些时候正在调用另一种不同的方法。 E.g:

// method 1
method1(){
  // same code for Method1 and Method2 before calling different method
  methodA();
  // same code for Method1 and Method2 after calling different method
}

// method 2
method2(){
  // same code for Method1 and Method2 before calling different method
  methodB();
 // same code for Method1 and Method2 after calling different method
}

我想创建一个方法(method),它可以调用不同的方法(methodAmethodB)。我想这应该可以通过多态(如果我错误地纠正了我),例如:

method(Parent obj){
  // same code for Method1 and Method2 before calling different method
  obj->methodAB();
  // same code for Method1 and Method2 after calling different method
}

class Parent{
public:
  virtual int methodAB();
};

// methodA implementation
Class ChildA: public Parent{
public:
 int methodAB();
}

// methodB implementation
Class ChildB: public Parent{
public:
 int methodAB();
}

实际调用将是:

Parent *obj = new ChildA; // or Parent *obj = new ChildB;
method1(obj)
delete obj;

但是有一个严重的问题:在我的情况下methodA()methodB()将不同的类型作为参数,所以我的情况实际上是:

method1(obj_type1){
  // same code for Method1 and Method2 before calling different method
  methodA(obj_type1);
  // same code for Method1 and Method2 after calling different method
}


method2(obj_type2){
  // same code for Method1 and Method2 before calling different method
  methodB(obj_type2);
 // same code for Method1 and Method2 after calling different method
}

是否可以在派生类中使用不同类型作为参数实现虚函数,或者是否有任何其他优雅的解决方案可以解决此问题?

2 个答案:

答案 0 :(得分:2)

因此将公共代码重构为其他一些函数,并从两个方法(成员函数)中调用它们:

method1(){
  common_code_1();
  auto result = methodA(obj_type1);
  common_code_2(result);
}


method2(){
  common_code_1();
  auto result = methodB(obj_type2);
  common_code_2(result);

}

答案 1 :(得分:1)

您可以使用模板来执行您想要的操作,具体如下:

void foo1(int i)
{

}

void foo2(double d)
{

}

template<typename ArgType, void (*Func)(ArgType arg)>
void DoIt(ArgType a)
{
  // Common 1
  Func(a);   
  // Common 2
}

int main()
{
    DoIt<int, foo1>(1);
    DoIt<double, foo2>(1.0);

   return 0;
}

Func不一定是void,它可以返回bool或其他任何内容,如果这是您处理所需的内容。