我的项目中有类似于以下结构的内容。
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
功能的重复。我尝试了多重继承,但(显然)没有用。
有没有办法调整ProgrammersCalculatorI
和MathematiciansCalculatorI
的结构,以便add
方法只需执行一次?
在实际项目add
中有几百行,并且有几种类似的方法。
答案 0 :(得分:1)
您必须让ProgrammersCacluator
和MathematiciansCalculator
继承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 & );
};