2013-11-25 69 views
0

我在我的项目中有类似于以下结构的东西。实现接口的通用函数

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(互联网通信引擎)执行,这是我们正在使用的框架在项目的各个部分之间进行通信。

我特别关心的是add函数的重复。我尝试了多重继承,但是(显然)不起作用。

有没有办法调整ProgrammersCalculatorIMathematiciansCalculatorI的结构使得add方法只需要执行一次?

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

+0

有一个“HumansCalculator”接口,为数学家和程序员之间常见的所有操作提供虚拟功能? – Chad

回答

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 &); 
}; 
+0

这将如何在切片?我找不到有关继承的任何文档。我的印象是它不被支持。 – screenmutt

+0

@screenmutt在切片上增加了一个例子,当然它支持继承http://doc.zeroc.com/display/Ice/Interface+Inheritance – Slava

+0

不幸的是,这是一个接口继承的实现。这不适用于实施。 – screenmutt