デザインパターンのためのオプション機能?
-
23-08-2019 - |
質問
Iついての基本的なクラス由来のサブクラスからは継承し、基本機能は同じすべての派生クラス
class Basic {
public:
Run() {
int input = something->getsomething();
switch(input)
{
/* Basic functionality */
case 1:
doA();
break;
case 2:
doB();
break;
case 5:
Foo();
break;
}
}
};
現在の派生クラスいて、"追加"より諸表の場合のスイッチです。何が私のオプション。Iを付与することも可能で仮想機能に限定し由来の授業をされる方は是非ご参加ください使用してい:
class Basic {
protected:
virtual void DoSomethingElse();
public:
Run() {
int input = something->getsomething();
switch(input)
{
/* Basic functionality */
...
case 6:
DoSomethingElse();
}
}
};
class Derived : public Basic {
protected:
void DoSomethingElse() { ... }
}
この意味が変化する機能又は導出クラスで、編集私の基底クラスにこれらの変更が反映されます。
あるデザインパターンを具体的にはこのようなのでしょうか購入した書籍を多数のデザインパターンが研究していて"による)が必要となります"をベースになっている場合があるようなパターンを見ています。
解決
あなたは責任パターンでのチェーンについて読み、再考すると便利かもしれませんその方法で、あなたのソリューションます。
また、あなたが保護された方法として「doRun」を宣言し、ベースデフォルトの場合には、それを呼び出すことができます。
default:
doRun(input);
と派生クラスでdoRunを定義します。
のこのように呼ばれる Template Methodパターン
他のヒント
私はあなたが必要とするパターンが責任のチェーンのまたは多分の戦略のダイナミックコールテーブルと組み合わせて...
だと思います通常の方法を扱うことがあります。概要:
- 作成上の階層に関連したクラスを提供するのは可能です。
- をファクトリクラスとしており、入力のインスタンスを作成し、右kindfのクラスによっては入力
この追加ボーナスポイント:
- 制の構築とreghisters授業withnの工場を指定する必要がありますが、入力のタイプのクラスまで
今が必要で新しい入力がやって来て、あなただける新しいクラスに登録します。の必要性はswitchステートメントが消えます。
、私は、ルックアップテーブルによってcase文を置き換えます。 (ケース内のアクションは、各関数のようにコード化する必要がありますので、あなたは、テーブル内の関数ポインタを置くことができます)。次に、継承されたクラスは、ちょうどテーブルにエントリを追加することができます。 (私はそれが静的であることができない、テーブルがインスタンスプロパティでなければならないであろうと思います)。
コリン
しかし、これが意味するであろう変更したとき 派生クラスで機能し、I に私の基本クラスを編集する必要があります それらの変更を反映します。
なぜこれは本当でしょうか?
私はあなたのコメントの光の - あなたがこのアプローチを選択した場合、あなたは、これらの問題を持っています。その他には、他のソリューションを提案する答えを掲載している - 私は、彼らはあなたを助けるかどうかを確認するためにこれらをチェックアウトしたい。
。А簡単な解決策ます:
class Basic {
public:
void Run() {
const int input = ...
if (!(BaseProcess(input) || Process(input))) ...
}
vitual bool Process(int input) { return false; }
bool BaseProcess(int input) {
switch(input) {
...
default: return false;
}
return true;
}
...
...そして(サブクラスプロセスで追加の例を実装します)。 あなたが2つの以上のレベルを(すなわち、サブサブクラスにも多くの例を追加)をサポートする必要がある場合は、ダイナミックディスパッチテーブルが必要になります。