我有现有的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我想过使用适配器模式或向两个类注册一个共同的行为。或者添加一个助手类来移动通用代码并在新老类中调用这些函数。我无法选择哪一种最适合这种情况。 –
显示一些代码。如果您的代码太大,请展示一个较小的说明性示例。 –