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

c# - ジェネリックを使用した複数のディスパッチ

ジェネリックを使用してファクトリ/ビルダーを提供することにより、インターフェイスの実装を抽象化しようとしています。ただし、実行時に複数のディスパッチと C# ジェネリックで問題が発生し、奇妙なことを行っています。

基本的なシナリオは、いくつかのインターフェイスを定義したことです。

次に、実際の実装を返すファクトリ クラスがあります。

問題は、ファクトリが次new Factory().BuildModel<IAddressModel>() のように呼び出される場合です。実行時にジェネリックからディスパッチされる BuildModel(...) メソッドは、常に T の最小派生形式であり、この場合は常にオブジェクトです。

ただし、new Factory().BuildModel(default(IAddressModel));正しいメソッドを呼び出すと、ディスパッチされます (これはおそらくコンパイル時に行われるためです)。ジェネリックを使用した動的ディスパッチは、コンパイル時または実行時に呼び出されるメソッドが同じである必要があるにもかかわらず、最も派生した型のメソッドをチェックしないようです。理想的には、BuildModel(...) メソッドを非公開にして、ジェネリック メソッドのみを公開したいと考えています。動的ディスパッチが実行時に正しいメソッドを呼び出すようにする別の方法はありますか? BuildModel<>()実装を変更しようとしましreturn BuildModel((dynamic)default(T))たが、これにより、ディスパッチするメソッドを決定できないという実行時エラーがスローされます。反変性とより多くのインターフェースでこれを行う方法はありますか?

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

c# - C#のインターフェイスで複数のディスパッチを行う方法は?

次のクラス構造があるとします。

クラス構造

ページ

、およびインターフェイスは、クライアントによって実装されますPage。これらは、ページ タイプ (静的または動的) に応じてさまざまなデータを提供し、. これらのインターフェースには多くの実装があるかもしれません。StaticPageDynamicPageRenderer

レンダラー

Rendererページをレンダリングします。また、このインターフェースには複数の実装が存在する場合があります (さまざまなレンダリング手法用)。

レンダーマネージャー

これは、指定されたページ タイプに応じて、提供されたレンダラーで適切な render メソッドを呼び出すことになっている単なるファサードです。そして、ここにあります

問題

Renderer提供されたページの種類に応じて、オブジェクトで呼び出すメソッドを決定する方法は?

現在の (不十分な) 解決策

現在、条件を使用してディスパッチしています:

どうしたの

このソリューションの問題点は、別のページ タイプを追加する (つまり、Pageインターフェイスを拡張する) 場合は常に、このメソッドも調整する必要があることです。実際、これはオブジェクト指向言語のポリモーフィック(仮想) メソッドが使用されると想定されているものですが、この場合、これは機能しません (以下の理由を参照)。

検討したが却下したその他の解決策

  1. interface の代わりに抽象クラス。これにより、実装者の型階層に不必要な制約が課されます。実装者は、必要なクラスを拡張できなくなり、代わりに抽象StaticPageまたはDynamicPageクラスを拡張することを余儀なくされます。これは最悪です。

  2. インターフェイスにメソッドを追加dispatch(Renderer render)し、ページ タイプに応じてレンダラー オブジェクトで適切なメソッドを呼び出すように実装者に強制します。実装者はレンダリングを気にするべきではないため、これは明らかにひどいものです。レンダリングするデータを提供するだけでよいのです。

では、この状況で役立つパターンや代替設計があるのではないでしょうか? どんなアイデアでも大歓迎です。:)

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

multiple-dispatch - メソッドの要件を緩和する方法

要件を緩和するとはどういう意味ですか? たとえば、2 つの Integer を取り込んでそれらを別の Integer に追加する単純なメソッドでは、そのメソッドの要件をどのように緩和できるでしょうか?

Even と Natural はどちらも、関連する場合、クラス Integer を拡張します。3 つのクラスはすべて異なる add() メソッドを持ちます。Integer は、クライアントのメソッド f() の形式でそれを持つ唯一のクラスです。

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

c++ - 派生クラスでのオーバーロード メソッドと複数のディスパッチ

ウィキペディアによると複数発送とは

... 関数またはメソッドは、複数の引数の実行時 (動的) 型に基づいて動的にディスパッチできます。

ただし、C++ では、派生クラスで関数をオーバーライドできます。

ここでmethodは実行時にバインドされており (私は を使用しているためvirtual)、入力パラメーターに基づいて特定のメソッドが選択されています。

二次的な質問: このポリモーフィズムとメソッドのオーバーロードの組み合わせが C++ に存在する場合、複数のディスパッチをサポートする言語の利点 (あるとすれば) は何ですか?

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

julia - 戻り値の複数ディスパッチ

任意の FloatingPoint 型 (または実際には任意の数値型ですが、浮動小数点を対象としています) の配列を返すことができるルーチンがあります。連分数の収束を計算します。私の問題は、一般的なコードを使用するのではなく、コンパイラに戻り値の型 (例: Float64、BigFloat など) ごとに最適化してもらいたいことです。

私にとって実行可能な唯一の解決策は、結果の配列を引数として渡し、それをパラメトリック関数にすることです

これに関する唯一の問題は、型を指定する以外に、結果の配列を引数として指定する理由がないことです。それは「正しい」ことのようには思えません。

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

c++ - Loki マルチメソッドは C++11 に組み込まれましたか?

Andrei Alexandrescuが適用したModern C++ Design Generic Programming and Design Patterns Appliedと、解決しようとしている問題を正確に扱っている multimethods に関する第 11 章を読んでいます。本のすべてのソース コードは、Lokiという名前のライブラリで公開されています。

問題は、この本がかなり古く (2001 年) 、C++11 ではもはや当てはまらない制限(たとえば、テンプレート パラメーターの数を可変にできないなど) を扱っていることです。Loki が C++11 を使用して書き直されているかどうか調べてみましたが、最後の変更は 2009 年であり、Andrei Alexandrescu のホームページには更新がありません。しかし、いくつかの調査を行った結果、Loki は標準ライブラリに組み込まれるという意味で Boost のようなものであるという印象を受けました。

マルチメソッドのイディオムまたはその一部は C++11 に採用されていますか?

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

arrays - 複数の型と配列を扱うときに「良い」Juliaコードを書く方法(複数ディスパッチ)

OP UPDATE: Juliaの最新バージョン(v0.5)では、この質問に答える慣用的なアプローチは、定義するだけであることに注意してくださいmysquare(x::Number) = x^2。ベクトル化されたケースは、自動ブロードキャストを使用してカバーされますx = randn(5) ; mysquare.(x)。ドット構文をより詳細に説明している新しい回答も参照してください。

私は Julia を初めて使用し、Matlab の出自を考えると、複数のディスパッチと Julia の型システムを利用する「適切な」Julia コードの書き方を判断するのに苦労しています。

a の 2 乗を提供する関数がある場合を考えてみましょうFloat64。私はこれを次のように書くかもしれません:

場合によっては、1 次元配列内のすべての s を 2 乗しFloat64たいが、毎回ループを書きたくないmysquareので、複数のディスパッチを使用して次を追加します。

しかし、今は時々Int64を使っているので、複数のディスパッチを利用する関数をさらに 2 つ書きます。

これは正しいですか?または、この状況に対処するためのより理想的な方法はありますか? このような型パラメーターを使用する必要がありますか?

これは理にかなっているように思えますが、私のコードは、パラメトリック型を避けた場合と同じくらい速く実行されるでしょうか?

要約すると、私の質問には 2 つの部分があります。

  1. 高速なコードが重要な場合、上記のようにパラメトリック型を使用する必要がありますか?それとも、異なる具象型に対して複数のバージョンを作成する必要がありますか? それとも、まったく別のことをする必要がありますか?

  2. スカラーだけでなく配列も操作する関数が必要な場合、スカラー用と配列用の 2 つのバージョンの関数を作成することをお勧めしますか? それとも、まったく別のことをする必要がありますか?

最後に、上記のコードで考えられるその他の問題を指摘してください。ここでの私の最終的な目標は、優れた Julia コードを書くことです。

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

oop - Julia: OOP の複数ディスパッチについて

次のタイプがあるとしましょう。

describeそして、それらの内部のデータを出力するメソッドを両方に追加したいと思います。このようにメソッドを使用するのが最善ですか:

出力:

または、前に投稿したこの質問のような関数を使用する必要があります: Julia: What is the best way to setup a OOP model for a library

どちらの方法がより効率的ですか?

ドキュメントのほとんどのMethods例は単純な関数ですが、ループを使用してより複雑にしたい場合、または if ステートメントは可能ですか?Method