我有現有的C++類A具有巨大的實現。如何避免具有不同類層次的新類的相同實現
根據我的項目需求,我需要創建新的C++類B,它們具有不同的類層次結構。但是兩個類的實現完全一樣。所以在這裏我想避免代碼複製新舊類。
請任何人建議我,我將如何通過最適當的設計來實現這一點。
我有現有的C++類A具有巨大的實現。如何避免具有不同類層次的新類的相同實現
根據我的項目需求,我需要創建新的C++類B,它們具有不同的類層次結構。但是兩個類的實現完全一樣。所以在這裏我想避免代碼複製新舊類。
請任何人建議我,我將如何通過最適當的設計來實現這一點。
一種方法是製作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的充分再利用。
如果他們真的有內部相同的代碼,您可以通過將原始類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;
這裏有一個橋樑設計模式是如何來得心應手:
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();}
未成年人,但可能混淆錯字:類B有一個名爲A的構造函數。 – Arunas
那麼,你嘗試過這麼遠嗎?純粹的建議最好不要在這裏問。 – Arunmu
@aurunmu我想過使用適配器模式或向兩個類註冊一個共同的行爲。或者添加一個助手類來移動通用代碼並在新老類中調用這些函數。我無法選擇哪一種最適合這種情況。 –
顯示一些代碼。如果您的代碼太大,請展示一個較小的說明性示例。 –