私は巨大な実装を持つExisting C++クラスAを持っています。異なるクラス階層を持つ新しいクラスの同じ実装を避ける方法
私のプロジェクト要件に応じて、すべてのクラス階層が異なる新しいC++クラスBを作成する必要があります。しかし、両方のクラスの実装はまったく同じです。そこでここでは、古いクラスだけでなく新しいクラスのコードの重複も避けたいと考えています。
誰かが私に示唆してください、どのように私は最も適切なデザインでこれを達成すると思いますか?
私は巨大な実装を持つExisting C++クラスAを持っています。異なるクラス階層を持つ新しいクラスの同じ実装を避ける方法
私のプロジェクト要件に応じて、すべてのクラス階層が異なる新しいC++クラスBを作成する必要があります。しかし、両方のクラスの実装はまったく同じです。そこでここでは、古いクラスだけでなく新しいクラスのコードの重複も避けたいと考えています。
誰かが私に示唆してください、どのように私は最も適切なデザインでこれを達成すると思いますか?
1つのアプローチは、クラスAとクラスBの両方が実装しているインタフェース(純粋仮想クラス)を作成してから、AのBをメンバとしてカプセル化します。 Bのメソッドの
実装はのメンバーに対応するメソッドを呼び出します:
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アダプターパターンの使用、または両方のクラスに共通の動作の登録を考えました。ヘルパークラスを1つ追加して共通コードを移動し、それらの関数を新旧のクラスで呼び出すことができます。私はこの状況に最も適した選択をすることができませんでした。 –
コードを表示してください。あなたのコードが大きすぎる場合は、より具体的な例を示してください。 –