2013-11-25 115 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