2016-11-22 153 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

相关问题