2013-07-29 30 views
0

我正在尋找實現接口實現子集之間通用代碼的最佳方式。具體來說,假設我們有一個由A,B和C實現的接口P.同樣,假設A和B具有某些共同的功能(通用代碼),B和C具有一定的通用功能,並且類似地,A和C具有通用功能在執行界面。據我所知,:如何最佳地實現繼承類的子集之間的通用功能

  1. 我們可以使中間類對於每一對,對包含有公共的功能,然後從中間的類,例如,中間AB類實現用於公共代碼A和B和BC之間的共同代碼派生的類在B和C之間,然後從AB和BC中導出B.
  2. 複製的類的代碼在每對

1應該theortically是最佳的解決方案,但是,它practially可以創建一個巨大的混亂,因爲其實我也只是有3類實現接口,而是他們的人數很多。而且,常見的功能不僅在對之間而且在類的大部分子集中,並且存在許多這樣的子集。因此,我們需要有大量的中間類來實現不同子集之間的通用功能。這使得通過中間類來實現變得很難/效率低下,因爲我們需要大量的這些中間類。

我相信2也不是最好的解決方案,因爲它需要代碼複製,這會導致代碼維護的問題。

編輯:我試圖簡化問題,以給出清晰的圖片迴應評論。

+0

繼承應該用於接口/替換。 'P'是否描述了一個由子類實現的接口? –

+0

4-使用一個接口,你可以有一個以此接口爲參數的函數來做通用代碼 –

+0

除非你要看任意的B和Cs做X,任意的A和B做Y,而A, B和C的做Z,比你可能寧願構成比繼承。 – IdeaHat

回答

0

您可以在模板函數中定義您的通用實現,並根據需要從每個類中調用它們以實現接口函數。

使用接口P,類A,B和C,它給出了以下內容。

struct P { 
    virtual int X() = 0; 
}; 

template <typename T> 
int CommonAB(T const & t) { return t.x; } 

template <typename T> 
int CommonBC(T const & t) { return t.y; } 

template <typename T> 
int CommonCA(T const & t) { return t.x+t.y; } 


struct A : public P { 
    int X() { return CommonAB(*this)+CommonCA(*this); } 
protected: 
    int x; 
    int y; 
friend int CommonAB<A>(A const &); 
friend int CommonCA<A>(A const &); 
}; 

struct B : public P { 
    int X() { return CommonBC(*this)+CommonAB(*this); } 
protected: 
    short x; 
    short y; 
friend int CommonBC<B>(B const &); 
friend int CommonAB<B>(B const &); 
}; 

struct C : public P { 
    int X() { return CommonCA(*this)+CommonBC(*this); } 
protected: 
    char x; 
    char y; 
friend int CommonCA<C>(C const &); 
friend int CommonBC<C>(C const &); 
}; 


int main() 
{ 
    A a; 
    B b; 
    C c; 

    a.X(); 
    b.X(); 
    c.X(); 

    return 0; 
}