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

c# - 渡されたFunc<>パラメータに割り当てられたメソッドへのアクセス

明らかな何かを見逃しているように見えますが、渡されたパラメーターに割り当てられたメソッドを使用/アクセスできない理由を本当に理解できませんFunc<>。外部呼び出しコンテキストでアクセス/呼び出したいです。

簡単な例の下:(実際のresultsデータ型はstring複雑な型ではありません)

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

java - Java でメソッドを魔法のように呼び出す

PHPにあるように、Javaで魔法のメソッドを使用する方法はあり__callますか?

例えば:

コードを簡素化するために、getter メソッドと setter メソッドにProject Lombokアノテーションを使用しています。

私のマップには文字列によってマップされたいくつかのアイテムが含まれており、defaultKey はデフォルトのものを定義していると考えてみましょう。

私が望むのはfoo.getName()、デフォルト名を として返す呼び出しができることですfoo.myMap.get(defaultKey).getName()

すべてのゲッターを手動で記述できない理由は、実際には Foo クラスがジェネリックで継承されており、内部クラスが異なる可能性があるためです。

私は次のようなものが必要です:

これはどういうわけかJavaで可能ですか?

編集:

ここで達成しようとしていることのより正確な例を作成しました: https://gist.github.com/1864457

これを行う唯一の理由は、内部クラスのメソッドを「簡略化」することです。

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

oop - アセンブリを見て、プログラムが動的ディスパッチを使用しているかどうかを確認する方法

ハーブスタッターのRedditに関する投稿を読みました:JITはネイティブほど速くなることはなく、誰かがハーブと呼ばれる誰かが非仮想ではなく仮想メソッドを使用していることを「誤解」しているとコメントしました(記事はこちらで読むことができます) )。それは私に考えさせられました、そして私は簡単な小さなプログラムを作りました、そしてC#が実際にCILのための仮想メソッド(callvirt対call)を生成することに気づきました。しかし、それはそれほど簡単ではなく、JITはvtablesと動的ディスパッチを使用する代わりにコードをインライン化する可能性があると言われました。デバッガーを起動して、確認しようとしました。これが私の簡単なプログラムです:

そして、ここにアセンブリがあります:

私の質問はこれです:アセンブリを見ると、動的ディスパッチを使用しているかどうかをどのように判断できますか?私の勘は、プログラミング言語のクラスで覚えているものに似ているこれらの4つの命令によるものです。

これが動的ディスパッチであると仮定して正しいですか?もしそうなら、他に物語の兆候はありますか?私が間違っている場合、それが動的ディスパッチであるかどうかをどのように判断できますか?

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

f# - サードパーティ タイプの動的ディスパッチ

これは、タイプ セーフな方法でサードパーティの型を拡張するという以前の質問に関連しています。いくつかの良い答えがありましたが、それらはコンパイル時に認識されている具象型に依存しています。私はこれに依存することはできません。型が箱入りの場合もあります。サードパーティの型を拡張して動的ディスパッチをシミュレートする方法はありますか?

私は自分のライブラリにインターフェースを使用します。例えば:

補足として、次のことができればいいと思います。

しかし、ランタイム キャストとインライン化を組み合わせることは明らかに不可能です。

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

objective-c - 多くの小さなメソッドをコーディングすると、Objective-C のパフォーマンスに影響がありますか?

私はRuby出身で、単一責任の原則、カプセル化、疎結合、小さなテスト可能なメソッドなどの方法論を採用しているため、コードはメソッドからメソッドへと頻繁にジャンプする傾向があります。それが、Ruby の世界での作業に慣れている方法です。複数のことを行う「大規模な」メソッドを使い始めると、テストが非常に難しくなるため、これが主に BDD の場合に最適な方法であると私は主張します。

パフォーマンスの顕著な違いに関して、このアプローチに欠点があるかどうか疑問に思っていますか?

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

java - オブジェクト参照からスーパー クラス メソッドにアクセスする (初心者)

このクラスがあるとします:

クラス B のオブジェクトが与えられた場合、クラス A から明示的に foo メソッドを呼び出すことができますか? オブジェクトをダウンキャストしてみました。つまり、

しかし、それはうまくいかないようです。

Javaでやりたいことを達成する方法はありますか?

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

haskell - Haskellでの動的ディスパッチ

たとえば、Javaで記述されたプログラムは、動的ディスパッチに大きく依存しています。

そのようなプログラムはHaskellのような関数型言語でどのように表現されていますか?

言い換えれば、「ダイナミックディスパッチャ」の下でアイデアを表現するハスケルの方法は何ですか?

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

c# - 訪問者パターンのない動的ディスパッチ

問題

ソースコードにアクセスできない既存のライブラリを使用しています。このライブラリは AST を表します。

この AST の一部をコピーしたいのですが、その過程で変数への参照の名前を変更します。Expression オブジェクトを保持する AssignCommand オブジェクトが存在する可能性があるため、各オブジェクトを独自の関数でコピーできるようにして、それらを再帰的に呼び出すことができるようにしたいと考えています。ただし、ライブラリのコードにアクセスできないため、 などのメソッドを追加することはできませんCopyAndRename(string prefix)

したがって、私のアプローチは、いくつかのオーバーロードを持つ単一の関数を作成することでしたRename。したがって、次のような家族機能があります。

関数は で構成されます。List<Command>ここで、AssignCommandは のサブクラスですCommandCommand-function に aを渡すだけRenameで、ランタイムが最も具体的なものを見つけると仮定しました。ただし、そうではなく、すべてのコマンドが に渡されCommand Rename(Command cmd, string prefix)ます。これはなぜですか?醜い操作を使用せずに、呼び出しを正しい関数に委任する方法はありisますか?

最小限の例

この問題を次の NUnit-Testcode に分解しました

つまり、私の質問は次のようにis要約できます。

拡張方法

また、次のように拡張メソッドを使用してみました。上記のアプローチの構文糖衣にすぎないため、これは問題を解決しませんでした。

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

javascript - extjsクラスの関数を動的に呼び出す

次のようなExtJsクラスがあります。

strここで、実行する必要のあるメソッド名を含む文字列=>を取得します。strの文字列で指定されたRuleExecutorのメソッドを呼び出す必要があります

メソッドは正しく呼び出されますが、引数は渡されません。

このような:

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

ios - 遅延 0 の PerformSelector?

重複の可能性
: -performSelector:withObject:afterDelay: はどのように機能しますか?

私はこのコードをよく使用して、長時間実行されるメソッドを呼び出す前に UI の処理を​​終了させます。

しかし、それは何をしますか?

私の個人的な解釈は、常にgo次の実行ループでメソッドが呼び出されるというものでしたが、確かにそれは正しくありません。