問題タブ [multiple-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.

0 投票する
7 に答える
8778 参照

oop - ポリモーフィズムとマルチプル ディスパッチの違いは何ですか?

……それとも同じものですか?それぞれに独自のウィキペディア エントリがあることに気付きました: PolymorphismMultiple Dispatchですが、概念がどのように異なるかを理解するのに苦労しています。

編集:そして、オーバーロードはこれらすべてにどのように適合しますか?

0 投票する
2 に答える
2603 参照

java - Double Dispatch/Visitor パターンを使用せずに Java の静的メソッドのディスパッチを回避する

Fooこれらのメソッドを提供するクラスを使用しています:

Java はレシーバー以外の引数で静的にディスパッチするため、 my value(これは ですが、Object動的な type を持つ可能性がありますGoo) を渡すだけではなく、JVM に依存して「正しい」メソッドを動的に選択することはできません。

これは私の現在の(醜い)回避策です:

(オーバーロードされたメソッドを含むクラス)のコードを変更せずにFooこれを行うより良い方法はありますか?

0 投票する
8 に答える
10387 参照

c# - C# は単一ディスパッチ言語ですか、それとも複数ディスパッチ言語ですか?

単一および複数のディスパッチとは何かを正確に理解しようとしています。

私はちょうどこれを読みました:
http://en.wikipedia.org/wiki/Multiple_dispatch

そして、その定義から、呼び出すオーバーロードの選択はコンパイル時に行われますが、C# と VB.Net は複数ディスパッチであると思われます。

私はここで正しいですか、それとも何か不足していますか? ありがとう!

0 投票する
9 に答える
2633 参照

c# - - 単一ディスパッチと複数ディスパッチ (.NET に関連) とは?

それはオーバーロードと同じですか、そうでない場合は、C#でそれぞれの例を提供してください

SOで尋ねられた同様の質問への回答を読みました...それに投稿された回答を理解できませんでした。

ここで尋ねられた同様の質問

編集: C# 4.0 の新しい「動的」キーワードを使用すると、言語の「マルチ ディスパッチ」が有効になりますか?

0 投票する
3 に答える
19600 参照

c++ - C++ での複数ディスパッチ

複数のディスパッチとは何かを理解しようとしています。いろいろなテキストをたくさん読んだのですが、マルチディスパッチとは何か、何に役立つのか、いまだによくわかりません。たぶん、私が見逃しているのは、複数のディスパッチを使用するコードです。C++には単一のディスパッチしかないため、適切にコンパイル/実行できないことがわかるように、複数のディスパッチを使用してC++で小さなコードを記述できますか? 私は違いを見る必要があります。ありがとう。

0 投票する
6 に答える
581 参照

c++ - 派生オブジェクト間の特別な相互作用 (つまり、複数のディスパッチ)

したがって、基本クラスのポインターのリストがあります。

次に、ある時点で、オブジェクトの 1 つが他のすべてのオブジェクトを調べます。

私が達成したいのは、派生型objとが何であるかに応じて*it、それらが互いに異なる相互作用DerivedAをすることです。次のようなものです:DerivedBDerivedBbool c = true;

コンパイル時には、それらは両方ともBase-pointers であり、互いに呼び出すことができず、型が魔法のように現れることを期待できません。これが一方通行の関係である場合、つまり、そのうちの 1 つのタイプがわかっている場合は、Visitor パターンを使用できます。ある種のメディエーターパターンを使用する必要があると思いますが、メディエーターもポインターを保持するため、違いが生じないため、実際にどのように理解することができませんBase

続行する方法についての手がかりがありません... 誰か?


バックグラウンド:

私はゲームを作成しています。この問題は、ゲームの内容、つまり現在部屋にあるRoomものを追跡するクラスに起因しています。GameObject

オブジェクトが移動することがあります (たとえば、プレーヤー)。部屋は、すぐに移動される床タイル (上記のループ) にあるすべてのオブジェクトをループし、オブジェクトが互いに相互作用するかどうかを確認します。

たとえば、それTrollPlayer傷つけたい場合。または、彼は、別の「チーム」(関数からアクセスでき、すべてが実装されている)に由来するCharacterTrollPlayerから派生した)を傷つけたいだけです。CharactergetAlignment()Characters

0 投票する
3 に答える
220 参照

c++ - 多くの異なる型を取ることができる 2 つのオペランドを持つ仮想関数

具体的な例から始めましょう。C++ では、抽象基本クラスの下にクラスの階層がありますCollisionVolume。衝突ボリュームはdetectCollision、他のボリュームとできる必要があります。この衝突コードは、存在する 2 つのサブクラスに基づいて特殊化されていますが、交換可能ですdetectCollision(a, b) == detectCollision(b, a)

オブジェクトは通常抽象基本クラスであるため、仮想関数と同様のメカニズムを使用する必要があります。ただし、一般的な仮想メソッドを使用すると、選択された関数はオペランドの 1 つの型にのみ依存し、両方には依存しません。これを行うことができた唯一の方法は、RTTI または RTTI のようなメカニズムを使用することでした。

これを行うためのよりクリーンな方法はありますか?

0 投票する
3 に答える
603 参照

c# - C#で多重ディスパッチ通知アルゴリズムを最適化しますか?

タイトルについて申し訳ありませんが、問題を説明するためのより良い方法を考えることができませんでした。基本的に、私はゲームに衝突システムを実装しようとしています。特定のタイプにキャストできる2つのオブジェクト(いずれかの順序で指定)の衝突を処理する「衝突ハンドラー」を登録できるようにしたいと思います。したがって、Player : Ship : EntityLaser : Particle : Entity、およびのハンドラーが(Ship, Particle)(Laser, Entity)衝突よりも登録されている場合は(Laser, Player)、両方のハンドラーに引数を正しい順序で通知する必要があり、の衝突で(Laser, Laser)は2番目のハンドラーのみに通知する必要があります。

コードスニペットは千の単語を言っているので、これが私が今していることです(ナイーブメソッド):

ただし、この方法は非常に遅いため(測定可能です。これを実装した後、最大2 FPSを失いました)、これから数サイクル/割り当てを削減する方法を探しています。

私は(たとえば、1時間かけて実装し、そのようなばかであるために壁に頭をぶつけた)、ハッシュコードに基づいて型を並べ替え、辞書に入れて、各エントリを次のようにする方法を考えました。そのタイプのペアのハンドラーのリンクリストと、ハンドラーが引数の順序を逆にするかどうかをブール値で示します。残念ながら、これは派生型では機能しません。派生型が渡された場合、基本型についてサブスクライバーに通知されないためです。すべてのタイプペアを( 2回)チェックして一致するかどうかを確認するよりも良い方法を誰かが考えることができますか?

ありがとう、ロバート

0 投票する
2 に答える
1164 参照

c# - .NET 4.0の新しい「動的」変数タイプはCLRの単一/複数メソッドディスパッチの問題を解決しますか?

シングルディスパッチの問題は、JavaやC#などの静的に型指定された言語を使用したコーディングに従事する人々にはほとんどよく知られています。基本的な考え方は次のとおりです。

receiver実行時ポリモーフィズムにより、たとえば次のタイプ(実行時タイプ)に応じて適切なメソッド呼び出しにディスパッチできます。

mythingメソッド呼び出しは、の実行時型、つまり。に従って実行されますCat。これはシングルディスパッチ機能です(Java / C#に存在します)。

ここで、ランタイムタイプのレシーバーだけでなく、(複数の)引数のタイプでもディスパッチする必要がある場合は、少し問題が発生します。

2番目のメソッドは呼び出されません。これは、「consumer」コードでは、さまざまなタイプのオブジェクト(私の例では訪問者)を共通のスーパータイプまたはインターフェイスで処理する傾向があるためです。

動的型付けでは多重ディスパッチポリモーフィズムが可能であり、C#4.0にはその動的キーワードがあるためです;)

0 投票する
5 に答える
822 参照

c++ - リンゴ、オレンジ、および最も派生したc++クラスへのポインター

私がたくさんの果物を持っているとしましょう:

そして、上記の果物に作用するいくつかの多型関数:

OK、待ってください。すぐそこに止まります。この時点で、正気の人なら誰でもEat()をFruitクラスの仮想メンバー関数にすることに注意してください。しかし、私は正気の人ではないので、それは選択肢ではありません。また、フルーツクラスのヘッダーファイルにその農薬*を含めたくありません。

悲しいことに、次にできることは、メンバー関数と動的バインディングで可能なことです。

そして明らかに、ここでの問題は、Eat()に渡すポインターがApple*やOrange*ではなくFruit*になるため、何も食べられず、私たち全員が非常に空腹になることです。

だから私がこれの代わりに本当にやりたいこと:

これは:

しかし、私の限られた知識では、そのような魔法は存在しません。ただし、dynamic_castへの呼び出しでいっぱいの大きな厄介なifステートメントの形式を除いては。

それで、私が気付いていない実行時の魔法はありますか?または、dynamic_castsでいっぱいの大きな厄介なifステートメントを実装して維持する必要がありますか?それとも、私はそれを吸い上げて、Rubyでこれをどのように実装するかについて考えるのをやめ、少量の農薬が私の果物のヘッダーに入るのを許可する必要がありますか?

更新:裸のEat関数とPesticideを使った工夫の代わりに、意味がないのでEatを果物に入れたくないと仮定します。自分で食べる方法を知っている果物?Pshaw。代わりに、Eat関数を備えたEaterクラスが必要です。このクラスには、果物の種類ごとに異なるコードがあり、食べる人が認識できない果物の場合に備えて、デフォルトのコードがいくつかあります。

しかし、繰り返しになりますが、これは機能せず、C++での簡単な解決策はdynamic_castへの一連の呼び出しのようです。

ただし、回答の1つが示唆しているように、別の賢い解決策があるかもしれません。Fruitsが、MustPeel()やMustWash()などの関数を使用して、食べる人にとって重要な品質を公開した場合はどうなりますか?次に、単一のEat()関数でうまくいくことができます...

更新: Daniel Newbyは、Visitorを使用すると、提示された問題も解決されると指摘しています...しかし、これにはセマンティックな逆立ちが必要です(Fruit::useまたはFruit::beEaten?)。

私はいくつかの答えを受け入れたいと思いますが、psmearsの答えは実際には将来の読者にとって最良のものだと思います。みんな、ありがとう。