实现接口的通用功能

时间:2013-11-25 19:59:14

标签: c++ oop ice

我的项目中有类似于以下结构的内容。

class ProgrammersCacluator {
  public:
    virtual int add(int a, int b);
    virtual int rshift(int a, int b);
}

class MathematiciansCalculator {
  public:
    virtual int add(int a, int b);
    virtual int multiply(int a, int b);
}

我正在实施以下内容:

class ProgrammersCalculatorI : public virtual ProgrammersCalculator {
  public:
    int add(int a, int b);
    int rshift(int a, int b);
}

int ProgrammersCalculatorI::add(int a, int b) {
  return(a + b);
}

int ProgrammersCalculatorI::rshift(int a, int b) {
  return(a >> b);
}

class MathematiciansCalculatorI : public virtual MathematiciansCalculator {
  public:
    int add(int a, int b);
    int multiply(int a, int b);
}

int MathematiciansCalculatorI::add(int a, int b) {
  return(a + b);
}

int MathematiciansCalculatorI::multiply(int a, int b) {
  return(a * b);
}

现在我意识到这是一个额外的语法,但大多数是由ICE(Internet通信引擎)强制执行的,这是我们用来在项目各部分之间进行通信的框架。

我特别关注的是add功能的重复。我尝试了多重继承,但(显然)没有用。

有没有办法调整ProgrammersCalculatorIMathematiciansCalculatorI的结构,以便add方法只需执行一次?

在实际项目add中有几百行,并且有几种类似的方法。

1 个答案:

答案 0 :(得分:1)

您必须让ProgrammersCacluatorMathematiciansCalculator继承slice中的相同基数,如下所示:

interface BaseCacluator {
    idempotent int add(int a, int b);
};

interface ProgrammersCacluator extends BaseCalculator {
    idempotent int rshift(int a, int b);
};

interface MathematiciansCalculator extends BaseCalculator {
    idempotent int multiply(int a, int b);
};

然后,您可以使用多重继承仅实现add()一次并继承该实现:

class BaseCalculatorI : virtual public BaseCalculator {
public:
    virtual int add( int a, int b, const Ice::Current & );
};

class ProgrammersCalculatorI : public BaseCalculatorI, virtual public ProgrammersCalculator {
public:
    virtual int rshift( int a, int b, const Ice::Current & );
};