再利用を最大限にするために以下のコードを改善する方法についてのアドバイスを探しています。 クラスAには、いくつかの方法で使用される行列メンバーがあります。クラスBはクラスAと同じです(メソッドはストレートコピーペーストです)が、マトリックスメンバーは異なり、異なるタイプです。同一のメソッドで異なるメンバータイプのクラスを構造化する最良の方法
class A
{
public:
A() { set_matrix(); };
double operator()() { // uses method1 and method2 };
protected:
Matrix_Type_A matrix;
void set_matrix();
double method1() { // uses matrix };
double method2() { // uses matrix };
}
class B
{
public:
B() { set_matrix(); };
double operator()() { // uses method1 and method2 };
protected:
Matrix_Type_B matrix;
void set_matrix();
double method1() { // uses matrix. Identical to method1 in class A };
double method2() { // uses matrix. Identical to method2 in class A };
}
理想的には、両方の行列タイプで基礎となるコードが機能するクラスメソッドを再利用したいと考えています。
新しいメンバを持つ子クラスを作成するのが最初の考えでしたが、継承されたメソッドは派生変数ではなく基本クラスの変数を指しているため、これは機能しないと思います。例えば。このような何か:
class A
{
public:
A() { set_matrix(); };
protected:
Matrix_Type_A matrix;
void set_matrix();
double method1() { // uses matrix };
double method2() { // uses matrix };
}
class B : class A
{
private:
Matrix_Type_B matrix;
void set_matrix();
}
代替的には、私は方法を含む一般的な基本クラスを使用することができ、その後、異なるマトリックス部材と、クラスAとクラスBそれぞれを継承していることを考えていました。問題は、メソッドが派生クラスにのみ存在するメンバーを参照するため、基本クラスがコンパイルされないことです。
これをどのように構造化するかに関するアドバイスやアイデアは高く評価されています。
EDIT:
テンプレートのソリューションは、動作しているようです。私はどのようにMatrix_Type_A
とMatrix_Type_B
が同じメソッドを持っていることを確認します以下
template <class T> class A
{
public:
A() { set_matrix(); };
protected:
T matrix;
virtual void set_matrix() = 0;
double method1() { // uses matrix };
double method2() { // uses matrix };
}
class B : class A<Matrix_Type_A>
{
public:
B() { set_matrix(); };
private:
void set_matrix();
};
class C : class A<Matrix_Type_B>
{
public:
C() { set_matrix(); };
private:
void set_matrix();
}
これはテンプレートクラスのようです。 –
コンストラクタで仮想メソッドを呼び出さないようにするには、継承の代わりに特殊化を使用して、別名を使用します。 'using B = A;'。 –
Jarod42