2016-11-22 152 views
-1

我有現有的C++類A具有巨大的實現。如何避免具有不同類層次的新類的相同實現

根據我的項目需求,我需要創建新的C++類B,它們具有不同的類層次結構。但是兩個類的實現完全一樣。所以在這裏我想避免代碼複製新舊類。

請任何人建議我,我將如何通過最適當的設計來實現這一點。

+0

那麼,你嘗試過這麼遠嗎?純粹的建議最好不要在這裏問。 – Arunmu

+0

@aurunmu我想過使用適配器模式或向兩個類註冊一個共同的行爲。或者添加一個助手類來移動通用代碼並在新老類中調用這些函數。我無法選擇哪一種最適合這種情況。 –

+0

顯示一些代碼。如果您的代碼太大,請展示一個較小的說明性示例。 –

回答

0

一種方法是製作A類和B類都實現的接口(純虛擬類),然後將B作爲成員封裝在A中。

在B的方法的實現會在調用A的成員相應的方法:

public IA { 
public: 
    virtual void foo() = 0;   
}; 

class A : public IA { 
public: 
    void foo() override { /* the impl */ } 
} 

class B : public IA, public C /*new hierarchy*/ { 
    void foo() override { m_a.foo(); } 
private: 
     A m_a; 
} 

這樣,你得到次要代碼重複和A級的IMPL的充分再利用。

0

如果他們真的有內部相同的代碼,您可以通過將原始類A轉換爲模板來使用模板,其中唯一的模板參數是基類(-es)。

template<class base> class A_temp : public base{ 
    [your old code] 
} 

typedef A_temp<base_of_A> A; 
typedef A_temp<base_of_B> B; 
2

這裏有一個橋樑設計模式是如何來得心應手:

struct impl; // the common implementation 

class A 
{ 
    public: 
    A(); 
    //methods & properties 
    void fooA(); 
    private: 
    std::unique_ptr<impl> impl_; 
}; 

class B 
{ 
    public: 
     B(); 
    //methods & properties 
     void fooB(); 
    private: 
    std::unique_ptr<impl> impl_; 
}; 

//Implementation cpp file 

struct impl 
{ 
    void foo() 
    { 
    // do foo 
    } 
}; 

A::A():impl_(new impl){ } 
void A::fooA() { impl_->foo();} 
B::B():impl_(new impl){ } 
void B::fooB() { impl_->foo();} 
+0

未成年人,但可能混淆錯字:類B有一個名爲A的構造函數。 – Arunas

相關問題