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

ruby-on-rails - 動的メソッド内のインスタンス変数の変更 (ActiveResource を使用した動的リソース)

動的ディスパッチを使用して、ActiveResource から継承するクラスでいくつかのクラス メソッドを定義しています。

これは、最初の呼び出し (Invoice.get_details、Invoice.get_pending_notifications...) に関係なくうまく機能しますが、2 回目の呼び出しでは常に失敗します。

なぜこれが起こっているのか、そしてそれを修正するために何ができるのかを理解したいと思います.

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

oop - なぜ「オープン (またはクローズ) 再帰」と呼ばれるのですか?

オープン/クローズド再帰の説明をいくつか見つけましたが、定義に「再帰」という言葉が含まれている理由や、動的/静的ディスパッチとの比較がわかりません。私が見つけた説明の中には、次のようなものがあります。

再帰を開く。オブジェクトとクラスを持つほとんどの言語で提供されるもう 1 つの便利な機能は、1 つのメソッド本体が、selfまたは一部の言語ではthis. self の特別な動作は、遅延バインドされていることです。これにより、あるクラスで定義されたメソッドが、最初のクラスのサブクラスで後で定義された別のメソッドを呼び出すことができます。[ラルフ・ヒンツェ]

...またはウィキペディアで:

のディスパッチ セマンティクスthis、つまり this のメソッド呼び出しが動的にディスパッチされることは、オープン再帰と呼ばれ、派生クラスまたはオブジェクトによってこれらのメソッドをオーバーライドできることを意味します。対照的に、関数の直接の名前付き再帰または匿名再帰は、クローズド再帰を早期バインディングと共に使用します。

また、StackOverflow の質問:オープン再帰とは何ですか?も読みました。

しかし、定義に「再帰」という言葉が使われている理由がわかりません。もちろん、メソッドの再帰呼び出しを行うことで「オープン再帰」を使用すると、興味深い (または危険な) 副作用が発生する可能性があります。しかし、定義はメソッド/関数の再帰呼び出しを直接考慮していません (ウィキペディアの定義の「閉じた再帰」を除いて、「開いた再帰」は再帰呼び出しを参照していないため、奇妙に聞こえます)。

定義に「再帰」という言葉がある理由を知っていますか? 私が認識していない別のコンピューター サイエンスの定義に基づいているためですか? 単に「動的ディスパッチ」と言うだけでは不十分ですか?

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

c++ - C++ 仮想呼び出しのコストが派生クラスの数に依存するのはなぜですか?

EDIT : nm の要求により、その冗長性にもかかわらず、使用していた完全なコードを含めました。

仮想呼び出しのオーバーヘッドを調べるために使用していた短いサンプル プログラムを作成しました。

timer.h:

virtual.h:

virtual.cpp:

virtual_impl.cpp:

virtual_impl.cpp を共有ライブラリにコンパイルして、コンパイラが混乱したり、非仮想化またはインライン化されたりするのを防ぎます。

私が得る結果は次のとおりです。

ご覧のとおり、10 個の派生クラスを使用すると、派生クラスが 1 つだけの場合よりもコストが 3 倍近く高くなります。分岐予測はおそらくターゲットのように見えますが、どういうわけかタイプ別にソートされたリストでは、パフォーマンスはランダム リストよりもさらに悪くなります!

EDIT2 : コード生成で黒魔術が発生しているようには見えません。ここで分解を見つけましたmeasure_call

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

c++ - C ++は、キーワードを使用して派生クラスで動的ディスパッチを回避します

次の例では、動的ディスパッチを使用して仮想関数を呼び出しますか?

私が実装しているクラスにはより多くの情報が含まれていますが、一部の派生クラスではデフォルトのままにし、他のクラスではオーバーライドしたいものがあります。上記のコードの fn() はその例です。基本的には、基本クラスを使用して、オーバーライドされないたびに fn() を書き換えないようにしています。これは正しい方法ですか?

ありがとう!

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

java - 抽象クラスとサブクラス、およびメソッド呼び出し

みなさん、こんばんは。

サーブレットの抽象スーパークラスとサブクラスについて混乱があります。

私は抽象サーブレットスーパークラスを持っています:

そして、抽象スーパークラス、サブクラスの:

サブクラスを呼び出す場合、最初にKidsBooksPage初期化メソッドを実行することはわかっていますinit()が、問題は次のとおりです。

私のサブクラスKidsBooksPageが抽象スーパークラスを呼び出す理由CatalogPage. 使い方??理解できます。私に説明してください。

ありがとうございました。

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

c++ - ループ内の不変多相型による最適化

ループ内forの動的キャストのオーバーヘッドが原因で、必要以上に時間がかかっている高価なループがあります。

コード例は次のようになります (コンパイル可能)

クラスは関数内で変更されないため、ループ内でポリモーフィズムのオーバーヘッド (および分岐) を回避し、ループを複数回記述することなく単一の動的キャストと単一の関数呼び出しを実行する方法が必要であると思います.

私が考えたこと:

  1. 通話中にキャストしproceedます。
  2. 来客パターン。

それらのどれもが問題を解決するとは思いません。これらは、同じことを別の方法で行っているだけです。

設計を再考することを検討していますが、その前に、このコードを改善するために必要なアイデアや提案を喜んでお聞きします.