この問題にどのように名前を付けるかわからないので、できるだけよく説明しようと思います。
2つの異なるオブジェクトのタイプに応じて戦略を切り替えられるようにしたいと思います。これを機能させるために、オブジェクトに列挙型のフラグを付け、これらの戦略の「レジストリ」(配列)を作成することを考えています。理想的には、2つのタイプ間のビット演算子のような単純な操作で、正しい戦略にアクセスできます。
この擬似コードは、私が説明しようとしていることを理解しやすくする可能性があります。
enum Type { A, B, C }
struct Object {
Type type;
}
class ActionRunner {
vector<Strategy> strategies;
void registerStrategy(type1, type2, strategy) {
strategies[type1 operator type2] = strategy;
}
void runStrategyFor(type1, type2) {
strategies[type1 operator type2].execute();
}
}
これはマップを使用して簡単に解決できますが、マップはこのような問題に対してやり過ぎのようであり、配列を使用する方がおそらくはるかに高速であるため、配列またはベクトルを使用したいと思います。
したがって、問題は、正しい戦略の「位置」を選択するためにどの演算子を使用できるかわからないことです。私はいくつかの組み合わせを考えてきましたが、それらすべてが、ある時点で異なる組み合わせとの衝突を引き起こしてしまうようです。
誰かが私がこれに使用できるかもしれないものについての手がかり/アドバイスを持っていますか?
PS:時期尚早の最適化が悪いことは知っていますが、私はこの問題が簡単な方法で解決できるかどうかを理解しようとしています。
- - - - 編集 - - - - - - - - - - - - - - - - - - - - - ------
答えに照らして、私は問題にいくつかの追加の考えを与えてきました、そして私はこの質問で私が意図したことは私が望む方法では不可能であるという結論に達しました。この質問を使用して、現在解決しようとしている問題を言い換えようとします。
特定のタイプのオブジェクト「BaseClass」と、「BaseClass」から派生した2つのオブジェクトを受け取り、それらに対して適切な戦略を実行する「processor」オブジェクトが存在するクラス構造が必要です。このようなもの:
class Processor {
void run (DerivedA a, DerivedB b);
}
class BaseClass {}
class DerivedA: public BaseClass {}
class DerivedB: public BaseClass {}
BaseClass a = new DerivedA;
BaseClass b = new DerivedB;
processor.run(a, b)
私が理解していることによると、これは、「実行」するためのパラメーターとして渡されるものが参照である場合、私が期待するようには機能しません。あまりにも複雑なコードなしでこれを行う方法はありますか?(トリプルディスパッチ!?)
ダブルディスパッチとスレーブ(プロセッサ)オブジェクトを組み合わせたようなものを考えていますが、それは非常に複雑で、おそらく維持と拡張が面倒です。
ありがとう!