このプロジェクトには目標があります。それは、インターフェース中心の設計を使用することです。基本的には公開純粋関数のみのクラスを宣言し、それを実クラスに継承させます。
ここで 1 つの質問があります。ユーティリティ関数を再利用するにはどうすればよいでしょうか。
次に例を示します。
class InterF1 {
public:
int f1() = 0;
int g1() = 0;
};
class InterF2 {
public:
int f2() = 0;
};
class C1: public InterF1 {
public:
int f1();
int g1();
};
class C2: public InterF1, InterF2 {
public:
int f1();
int g1();
int f2();
};
C1::f1() と C2::f1() を実装していますが、これら 2 つの関数の間でコードの重複が見られます。重複を削除するにはどうすればよいですか?
ここに私の考えがあります:
1) 次のように protected をインターフェイス クラスに追加できます。
class InterF1 {
public:
int f1() = 0;
int g1() = 0;
protected:
int util();
int convenient_var_calculated_by_util;
};
上記の設計では、C1::f1() と C2::f2() の両方が util() を呼び出すことができます。
2) 新しいインターフェースを抽象化できます:
class UtilI {
public:
int util(int in_var) = 0;
};
この設計では、InterF1、C1、および C2 が次のように変更されます。
class InterF1 {
public:
int f1(UtilI u) = 0;
int g1() = 0;
};
class C1: public InterF1 {
public:
int f1(UtilI u);
int g1();
};
class C2: public InterF1, InterF2 {
public:
int f1(UtilI u);
int g1();
int f2();
};
C1::f1() と C2::f1() は両方とも UtilI API を呼び出します。
解決策 2 は、「インターフェイス中心」の目標により適しているように見え、見た目も良くなります。しかし、1 つの懸念があります。InterF1 と InterF2 自体は、実装の詳細である UtilI よりも高いレベルの抽象化である必要があります。2 つのレベルを混在させていますか? つまり、後で実装が変更された場合、f1() と f2() の署名を再度更新するために戻ってくる必要がありますが、これは正しくないように思えます。
解決策 1 は便利そうに見えますが、私には「純粋」ではないように見えます。