問題タブ [double-dispatch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 動的キーワードを使用しない動的二重ディスパッチ
この動的二重ディスパッチの例を C#に移植しようとしています。私は動作する例を持っていますが、リフレクションを使用して必要なハンドラーを作成し、適切なメソッドを呼び出すことDynamicDispatch
で、クラス内のメソッドを少しショートカットしたように感じます。MessageBase
変更方法についてアドバイスをいただけますか?この例では C++ の dynamic_cast 演算子を使用していますが、C# の同等の演算子が何であるかはわかりません。私の解決策が正しい/最善の方法であるかどうかはわかりません。
注: 3.5 を使用しているため、dynamic キーワードを使用できません
コードは次のとおりです。
メッセージ
MessageBase
メッセージ
IHandler
IMessageHandler
DerivedMessageOne
派生メッセージ 2
DerivedMessageHandlerOne
DerivedMessageHandlerTwo
テストケース
c++ - テンプレート オブジェクトの訪問者のようなパターン
私は学術目的でカスタムコリジョンエンジンを作成しようとしていますが、一般的なC ++プログラミングの問題に固執しています。適切に機能するすべてのジオメトリが既にあり、質問の範囲でこの機能があります:
実装を完了する必要がある次のクラスもあります
私の問題が発生するのは、リストを作成collidable_object
して交差 2 ごとにテストしたいときです。
Google でいくつかの調査を行ったところ、基本クラスをcollidable_object
使用すると、オブジェクトをリストに格納できることがわかりました。しかし、その後、特定のジオメトリに応じてオブジェクトをテストするにはどうすればよいでしょうか?
私は訪問者パターンを実装しようとしましたが、私は常にintersetcs()
.
協力的な訪問者に関する記事も見つけましたが、これは複雑なようです。
誰もがシンプルで効率的なソリューションを持っていますか?
編集: ジオメトリのリストを持つことを避けたかった理由は、樹木でファイルを見つけなくても新しいジオメトリを比較的簡単に追加できるようにしたいからです。
EDIT2:intersetcs
メソッドの詳細は次のとおりです。交差メソッドは、適切なジオメトリを見つけるためのタグ ディスパッチに基づいていますが、ほとんどすべての凸形状は、オブジェクトが特定の方向で最も遠いポイントを返すことができることのみを必要とする GJK アルゴリズムを使用します。非凸形状の場合、形状は凸サブ形状に断片化され、プロセスが再開されます。
intersects
が特定の形状を処理できるかどうかを確認するための統一基準はありfurthest_along
ませんが、球上の球はそうではなく、球の集約も の使用を必要としません。furthest_along
追加情報: VS2012 と C++11 を使用しています
c++ - 関数ポインタを使用したテンプレート化された二重ディスパッチ
学術目的でカスタム衝突エンジンを作成しようとしていますが、一般的な C++ プログラミングの問題に行き詰まりました。適切に機能するすべてのジオメトリが既にあり、衝突テストも適切に機能しています。
エンジンはこれら 2 つのクラスを使用して、テストするジオメトリのキューを作成します。
複数のジオメトリ タイプが可能であるため、テストする衝突を手動で指定する必要はありませんでした。
代わりに、この「テクニック」を使用して二重ディスパッチを実装しました。
ここで、関数check_object_collision
は衝突をテストするテンプレート関数であり、テスト済みです。
私の質問は次のとおりです:関数のキャストget_hit_function
はコンパイルされますが、疑わしいようです...未定義の動作と複数の悪夢につながる恐ろしい間違ったことをしていますか、それともテンプレートメンバー関数ポインターをある派生クラスから別の派生クラスにキャストしても問題ありませんか? .
私を混乱させているのは、Visual C ++ 2012でこれがコンパイルされ、適切に動作しているように見えることです...
このキャストがひどく間違っている原因は何ですか?
関数ポインターのキャストが何を意味するのかよくわかりません...
フォローアップの質問として、これを安全な方法で実装する方法はありますか
design-patterns - 「二重ポリモーフィズム」: 二重ディスパッチ パターンか、それとも単なるビジター パターンか?
私は
から派生する
メソッドが欲しい
と
pPAYOFF のランタイム タイプに応じて処理を実行しますが、
通常、
次のようなことをします
と
ここで、CALL_TOYFD と PUT_TOYFD は、PAYOFF_TOYFD から派生した public です。その後、次のようなものを書きたいと思います
ここで、bc は BC_TOYFD のインスタンスであり、pPAYOFF は PAYOFF_TOYFD へのポインターであり、実行時に bc と pPAYOFF の正しい型が解決されるようになっています。
他のヒント/精度なしで、「ダブルディスパッチ」または「逆ダブルディスパッチ」パターンを使用するように言われました。正確な方法を知らずに、このフレームワークに実装しようとしました。ちなみに、私は BC_TOYFD から派生した DIRICHLET_TOYFD のような「他の」クラスを持ちます。そのためには、解決しようとしている問題と同じ問題を保存する必要があるため、私の場合は二重ディスパッチが実践されていると思いますこの制約を考慮する必要があります。
どんな助けでも大歓迎です!
どうもありがとう !
java - ダブル ディスパッチを使用してグラフィック プリミティブの交差を分析するにはどうすればよいですか?
グラフィック プリミティブ (rect、line、circle など) の相互作用を分析し、オーバーラップ、相対方向、マージなどを計算しています。これは、Double Dispatch の代表的な例として引用されています (例Wikipedia )
通常、適応衝突アルゴリズムでは、異なるオブジェクト間の衝突を異なる方法で処理する必要があります。典型的な例は、宇宙船と小惑星の間の衝突が、宇宙船と宇宙ステーションの間の衝突とは異なる方法で計算されるゲーム環境です。1
しかし、私は主な説明を理解していませんし、SOの答えも一般的に理解していません。
私の現在のコード (Java) は、スーパークラス Shape を使用しており、次のようなものです。
次のようなサブクラス(ここではRect)の特定の実装
n*(n-1)/2
とにかく、すべてのメソッドを作成する必要があります (そして、そうしました)。また、後日対応する (たとえば) 拡張可能なコードも必要です。
二重ディスパッチ パターンの使用方法やその値がわかりません。Java グラフィックス プリミティブまたは同様の疑似コードを使用した具体的な例を教えていただければ幸いです。
更新: @Flavio は、尋ねられた正確な質問に答える (と思う) ため、受け入れました。ただし、@Slanec は私の問題を解決し、(私にとっては) よりシンプルで読みやすいため、実際に @Slanec を実装しました。「解決策は関係が対称であるかどうかに依存しますか?」という副次的な質問があります。
「A が B と交差する」は通常、「B が A と交差する」と同じですが、「A が B と衝突する」と「B が A と衝突する」とは必ずしも同じではありません。(A == 車、B == サイクリスト)。私の交差点が今後対称的ではない可能性があると考えられます (たとえば、「Rect が部分的に円を隠す」は対称的ではなく、異なるセマンティクスを持つ可能性があります。
@Flavio はメンテナンスの問題にうまく対処しており、コンパイラが問題をチェックできることを指摘しています。@Slanec はこれをリフレクションを介して行います。これは、メンテナンスの補助として役立つように見えます。パフォーマンスへの影響はわかりません。
java - Java の二重ディスパッチと汎用性
ダブルディスパッチパターンを広範囲に使用するアルゴリズムを拡張する必要があります。
このアルゴリズムは、いくつかの異なるデータ クラス (多くのクラス) を操作し、各クラスには同じ拡張機能が必要です。
既存のデータ クラス (シリアライゼーションの問題を制限するため) もアルゴリズム クラス (回帰を制限するため) も変更したくありません。そこで、新しいクラスを使用してソリューションを設計しました。
次の例のようなものを使用したいのですが、Java は私の型を認識することを拒否します。
それを修正する方法を知っているか、別の解決策を考えている場合は、遠慮なく答えてください。
ありがとう
objective-c - SpriteKit との衝突処理のための二重ディスパッチ
SpriteKit の衝突検出を使用しています。次のようなコールバックがあります。
接触オブジェクトには 2 つの物理体があります。
私のゲームにはたくさんのオブジェクトがあり、もちろん をテストして、categoryBitMask
何が何と衝突したかを調べることができます。しかし、私は多くの種類 (もちろん 32 以下) を持つつもりであり、新しい型を動的に導入する可能性があることを考えると、結果として生じる衝突、爆発、得点などのロジックをコーディングするために動的な二重ディスパッチを行う最もエレガントな方法は何ですか?これらすべての衝突から?もちろん、巨大な毛むくじゃらの if ステートメントを作成することはできますが、よりクリーンなものを望んでいました。
おそらく、適切なハンドラーのセレクターを格納するルックアップ テーブルですか? そして、categoryBitMasks
?の組み合わせでルックアップ テーブルにインデックスを付けます。いくつかの提案を聞きたいです。
javascript - JavaScript で動的に型指定された演算子の二重ディスパッチ
基礎となる数値型を交換できるような方法で代数式を定式化したいと考えています。必要に応じて、複素数、大整数、行列などについて考えてみてください。このため、の代わりにadd(a, b)
orと書きます。静的に型付けされた言語では、単純に関数の型ベースのオーバーロードを使用して、さまざまな代替手段を実装します。しかし、JavaScript ではこれが機能しないため、代替手段を探しています。実行されるメソッドは、両方のオペランドの型によって異なります。a.add(b)
a + b
add
私が思いついた方法の 1 つは、次の二重ディスパッチメカニズムです。
のように式を書き
a.add(b)
ます。次の方法で、特定のタイプ (たとえば、独自の
Complex
タイプ、または組み込みのNumber
タイプ) に対してそのメソッドを実装します。したがって、2 番目の呼び出しのメソッド名は、オペランドの 1 つの型をエンコードします。
すべての組み合わせを処理する特殊なメソッドを実装します。たとえば、
/li>
すべての型を知っていると仮定して、すべての組み合わせを確実に処理できるようにします。私が今困っているのは、これらのオブジェクトの作成です。
上記のアプローチは、仮想メソッドのディスパッチに大きく依存しているため、私が見る方法では、ある種の継承が必要です。従来のコンストラクタ関数では問題ありませんが、先ほど行ったこの jsperfによると、コンストラクタ関数を使用したオブジェクトの作成は、オブジェクト リテラルよりも遅くなる傾向があります。この例の Firefox の場合のように、非常に大きな要因で遅くなることがあります。したがって、演算子のオーバーロードを機能させるためだけに、複素数値の数値中間体などのすべてに対してこの種のオーバーヘッドが発生するのは気が進まない。
この jsperf で試したもう 1 つのアプローチは、プロトタイプを使用するのではなく、仮想メソッドを各オブジェクト インスタンスのプロパティとして格納することです。テスト済みのほとんどすべてのブラウザーで非常に高速に動作しますが、ここではオブジェクトのサイズが心配です。2 つの実際の浮動小数点値を持つオブジェクトを持つことを心配していますが、演算子のオーバーロードのすべてのペアを処理するためだけに、おそらく 50 もの異なるメンバー関数があります。
add
3 番目のアプローチは、何らかの方法で引数の型を検査し、それに基づいて決定を下す単一の関数を持つことです。いくつかの数値型識別子の組み合わせによってインデックス付けされたリストで実際の実装を検索する可能性があります。私はまだテスト用にこれを書いていませんが、この種の型チェックはかなり遅く感じます。また、JIT コンパイラがこの風変わりな種類の関数ディスパッチを最適化できるかどうかも疑問です。
現在の JavaScript 実装をだまして、オブジェクトを適切に最適化された二重ディスパッチにさせる方法はありますか?