問題タブ [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 投票する
10 に答える
695 参照

c++ - C++ では、最も派生したクラスへのポインターを要求できないのはなぜですか?

(この質問は、おそらく Stroustrup を参照して回答する必要があります。)

次のように、最も派生したクラスへのポインターを要求できると非常に便利です。

ただし、このメカニズムは c++ では提供されていません。なんで?

更新、動機付けの例:

Base と Derived と Processor の代わりに、次のものがあるとします。

しかし、これを C++ で行うのは難しく、ビジター パターンのような独創的なソリューションが必要です。問題は、「CAST_TO_MOST_DERIVED」のようなものを使用するとはるかに簡単になるのに、C++ でこれを行うのが難しいのはなぜですか?

更新: ウィキペディアはすべてを知っている

ポンタス・ガッジは良い答えを持っていると思います。ウィキペディアのMultiple Dispatchのエントリから、次のビットを追加します。

「Stroustrup は、The Design and Evolution of C++のマルチメソッドの概念が好きで、C++ での実装を検討したと述べていますが、(仮想関数に匹敵する) 効率的なサンプル実装を見つけることができず、型のあいまいさの問題を解決できなかったと主張しています。 . 彼は続けて、この機能はまだあればいいのですが、上記の C/C++ の例で概説したように、ダブル ディスパッチまたは型ベースのルックアップ テーブルを使用してほぼ実装できるため、将来の言語では優先度の低い機能であると述べています。リビジョン。」

背景については、 Multi-Methodsについての簡単な要約を読むことができます。これは、私が言及したような呼び出しよりも優れているでしょう。

0 投票する
1 に答える
599 参照

oop - マルチディスパッチとマルチメソッド

それらは何ですか、それらの間の違いは何ですか?

ウィキペディアのような多くの情報源は、それらは同じものであると主張していますが、この質問のsbiのように、他の情報源は明示的に反対のことを言っています:

最初:「ビジターパターンは、C++でのダブルディスパッチをシミュレートする方法です。」これは、えーと、完全には正しくありません。実際、ダブルディスパッチはマルチディスパッチの1つの形式であり、C ++で(欠落している)マルチメソッドをシミュレートする方法です。

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

java - すべての引数が同じインターフェースを実装するオーバーロードされたメソッドの呼び出し

私の出発点は次のとおりです
。-渡される引数のタイプに応じて異なる動作をするようにオーバーロードしたメソッドtransformがあります(transform(A a1、A a2)およびtransform(A a1、B b)を参照)以下の私の例では)
-これらの引数はすべて同じインターフェイスXを実装しています

その変換メソッドを、すべてXインターフェイスを実装しているさまざまなオブジェクトに適用したいと思います。

私が思いついたのは、transform(X x1、X x2)を実装することでした。これは、変換の関連するバリアントを適用する前に、各オブジェクトのインスタンスをチェックします。

それは機能しますが、コードは醜いようで、これらのさまざまなインスタンスの評価とキャストのパフォーマンスのオーバーヘッドも心配しています。その変換は、Javaで実行できる最善の方法ですか、それとも同じ動作を実現するためのよりエレガントで効率的な方法がありますか?

以下は、BAを印刷する簡単な実例です。そのコードを改善する方法の例を探しています。私の実際のコードでは、当然、「transform」の実装が多く、以下のように簡単なものはありません。

0 投票する
1 に答える
89 参照

architecture - どの特定のgameObjectが衝突しているかを識別する良い方法は何ですか?

これは物理エンジンに関するものです。衝突が発生すると、2つのgameObjectが衝突しているという情報が返されます。プレーヤー、モンスター、弾丸などのすべてのエンティティは、GameObjectから派生(継承)されます。

どの特定のgameObjectが衝突しているかを識別する良い方法は何ですか?

列挙型:列挙型の使用を検討しましたが、エンティティを追加し始めるとすぐに、考えられるすべての組み合わせを追跡することが管理できなくなります。

編集:ここでC#の潜在的な解決策を見つけました:http://blogs.msdn.com/b/laurionb/archive/2009/08/13/multimethods-in-c-4-0-with-dynamic.aspx

しかし、それでも、C ++でこれを実行する必要がある場合、どのように実行しますか?

0 投票する
1 に答える
328 参照

java - Java 7 の MethodHandles は複数のディスパッチを提供しますか?

method-handle オブジェクトは、multiple-dispatchを使用してメソッドを呼び出す機能を直接提供します。もしそうなら、二重ディスパッチのみがサポートされていますか、それともディスパッチメカニズムは必要なだけ多くの引数を考慮に入れますか? 複数のディスパッチがサポートされている場合、コード例は特に高く評価されます。

前もってありがとう、
マッケンジー

0 投票する
19 に答える
287806 参照

python - Python関数のオーバーロード

Pythonがメソッドのオーバーロードをサポートしていないことは知っていますが、Pythonのような方法で解決できないような問題が発生しました。

キャラクターがさまざまな弾丸を発射する必要があるゲームを作成していますが、これらの弾丸を作成するためのさまざまな関数を作成するにはどうすればよいですか?たとえば、指定された速度でポイントAからBに移動する弾丸を作成する関数があるとします。私はこのような関数を書きます:

しかし、私は次のような弾丸を作成するための他の関数を書きたいと思います。

など、さまざまなバリエーションがあります。多くのキーワード引数を使用せずにそれを行うためのより良い方法はありますか?add_bullet1、、、add_bullet2またはのいずれかを取得するため、各関数の名前を変更することもかなり悪いですadd_bullet_with_really_long_name

いくつかの答えに対処するには:

  1. いいえ、遅すぎるため、Bulletクラス階層を作成できません。弾丸を管理するための実際のコードはCであり、私の関数はCAPIのラッパーです。

  2. キーワード引数については知っていますが、パラメータのあらゆる種類の組み合わせをチェックするのは面倒ですが、デフォルトの引数は次のように割り当てるのに役立ちますacceleration=0

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

architecture - (ネスト?)多重ディスパッチ[ビジターパターン]

アプリケーションアーキテクチャの障害になりました。ビジターパターンを使用して、実行時にわからないタイプの抽象オブジェクトに対して特定のアルゴリズムを実行し始めました。私の問題は、私のアルゴリズムがネストされた抽象型の型にも依存していることです。

私が何を意味するかを説明しましょう:

抽象DataSourceクラスがあります。これから、concereteDataSourceReferenceクラスとDataSourceExplicitクラスを実装します。また、抽象Reportクラス(逆シリアル化されたメタデータ)があり、そこから具体的なReportクラスReportTypeAおよびReportTypeBを実装します。これらのオブジェクトが作成されるとき、それらのDataSourceは任意の拡張DataSourceクラスである可能性があります。

それに応じて実行できるように、実際のレポートタイプとデータソースタイプの両方が必要です。ビジターパターンを使用してコンサートレポートタイプを取得できますが、後でDataSourceに対して同じことを行う方法がわかりません。

レポートにアクセスした後、データソースにアクセスできません。具体的なタイプのレポートを失うためです(基本のレポートタイプを受け入れる必要があるため:Accept(SomeDataSourceVisitor d、MetaReport m)-またはすべての可能なレポートタイプに対してオーバーロードします、これはビジターパターンの目的を無効にします。私の問題を参照してください。

何か案は?ディスパッチャ(訪問者)が新しいレポートをサポートしていることを確認するために新しいレポートタイプの開発者を必要としないため、動的な使用は避けたいと思います。

現在のコード:

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

c# - c#複数のディスパッチオプション?

私はこれらのクラスを持っています:

これらの部外者の静的関数を検討してください。

私が書く場合:

それが呼び出されますFoo(House)(コンパイル時バインディング)

私が書く場合:

それが呼び出されますFoo(Asset) (コンパイル時バインディング)

ゴール : ランタイム型メソッドにアクセスします :

私には2つのオプションがあります:

1)このようなダイナミックを使用:

2) 関数をstaticからoverrideusingに移動しますpolymorphism mechanism

質問:

それを行う他の方法はありますか(関数をpolymorphism mechanism||に移動せずにdynamic)?

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

java - 多重ディスパッチを実装するには、invokedynamicを使用します

Java7の新しいバイトコード命令を使用して、Java言語の多重ディスパッチinvokedynamicを実装できるかどうか疑問に思いました。java.lang.invokeの下の新しいAPIは、そのようなことを実行するのに役立ちますか?

私が考えていたシナリオは次のようになりました。(これはビジターデザインパターンのアプリケーションケースのように見えますが、これが実行可能なオプションではない理由があるかもしれません。)

次に、ライブラリクラスMultipleDispatchは次のようなことを行います。

(私はMultiJavaを知っていますが、これはJavaの純粋な方法で実現できますか?)

0 投票する
4 に答える
310 参照

python - Pythonで「オーバーロードされた」関数を定義する

私は「魔法のメソッド」の構文や、Pythonで呼び出されるものなどが本当に好きです。

呼び出し

その後、に翻訳されます

「非魔法」関数のそのような動作を模倣することは可能ですか?数値計算では、クロネッカー積が必要であり、次のような「クロネッカー」関数が必要です。

実は

ユースケースは次のとおりです。たとえば、行列とベクトルの2つの類似したクラスがあり、どちらもクロネッカー積を持っています。呼びたい

行列クラスとベクトルクラスは1つの.pyファイルで定義されるため、共通の名前空間を共有します。では、上記のような関数を実装するための最良の(Pythonic?)方法は何ですか?可能な解決策:

1)1つのkron()関数を持ち、型チェックを行います

2)異なる名前空間を持つ

3)?