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

java - Javaの静的メソッド内のこの奇妙な動的メソッドディスパッチ動作は何ですか

以下の例のユーティリティ メソッドは、説明のみを目的としています。

以下の例では、instance method呼び出しは参照型にディスパッチされましたが、ランタイム オブジェクトにはディスパッチされませんでした。

以下は私が得た出力でした

調査の結果、java.util.Date.after(Date)が呼び出され、staticFindNewer()試行 1 と 2 で不一致が発生し、Date のメソッドが使用されていたため、精度が低下したことが原因であることがわかりました。

ただし、動的ディスパッチについては戸惑います。Timestamp#after(Timestamp)は呼び出されると思っていましたDate#after(Date)が、呼び出されていました。インスタンスメソッドのディスパッチは常にランタイムオブジェクトに基づいていると思いました。私は何かばかげたことを見逃していますか(おそらく)?

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

java - Java のオーバーロードおよびオーバーライドされた関数呼び出し

私はこの行を理解しようとしています:

これが私のアルゴリズムです: a には静的型 A と動的型 B があるので、階層を下ってクラス B に移動します。また、引数の静的型、つまり. b は B であるため、出力は次のようになります。

明らかに私は間違っています。私はこれを理解しようとしています。誰かが私が間違っている場所を理解するのを手伝ってくれますか? 私のアルゴリズムが間違っている場合はお知らせください。前もって感謝します。

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

java - Java 動的バインディング: コンパイラがオーバーライドされたメソッドを区別できない理由

私はより深いレバーでの動的/静的バインディングを理解しようとしています。多くの読書と検索の後、何かについて本当に混乱したと言えます。

Java はオーバーライドされたメソッドに動的バインディングを使用します。その理由は、コンパイラがメソッドがどのクラスに属しているかを認識していないからです。例えば ​​:

私の質問は、コードが Dog クラスの eat() メソッドを参照していることをコンパイラが認識しないのはなぜですか? オブジェクトは実行時に作成されますが、コードが Dog のメソッドを参照していることをコンパイラが理解できないのはなぜですか?それはコンパイラの設計の問題ですか、それとも何か不足していますか?

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

swift - Swift の動的ディスパッチとプロトコル

この(かなり退屈な)コードを考えてみましょう:

驚いたことに、これは印刷を開始しました

「Aの実装」

デフォルトの実装のdoThis(cell:header)一部としてオーバーライドされるため、「Bの実装」を出力することを期待していました。PBこれは驚くべきことに起こりませんでした。

さらに興味深いのは、これを行うと次のようになることです。

プリントアウト始めました

Bの実装

なぜこうなった?

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

java - Javaでのバインディングとディスパッチの違いは何ですか?

関連する名前が多すぎます: Early Binding と Late Binding、Static と Dynamic Dispatch、Runtime と Compile-time Polymorphism など、違いがわかりません。

明確な説明を見つけましたが、それは正しいですか? JustinCを言い換えます。

バインディング:変数 (オブジェクト?) の型を決定しています。コンパイル時に行われる場合は、早期バインディングです。実行時に行われる場合は、遅延バインディングです。

ディスパッチ:メソッド呼び出しに一致するメソッドを決定しています。静的ディスパッチはコンパイル時にメソッドを計算しますが、動的ディスパッチは実行時にそれを行います。

Binding は、プリミティブ変数と参照変数をそれぞれプリミティブ値とオブジェクトに一致させていますか?

編集:これについてもっと読むことができるように、明確な参考資料を教えてください。

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

java - サブクラス引数によるサブクラスのオーバーロード (java)

私のコードはこれに似ています:

B と C は A から継承します。

次に、このコードから Base の handleObject を呼び出します。

そして、タイプ B の各オブジェクトに対して Sub.handleObject(B b) が呼び出され、タイプ C に対して Sub.handleObject(C c) が呼び出され、タイプ A のオブジェクトに対して Base.handleObject(A a) が呼び出されることを期待しています。

実際の結果は、「A」を 3 回出力することです。

Java のオーバーロード機能を使用して動作させることは可能ですか、それともすべてのオブジェクトを自分で型チェックする必要がありますか? そうでない場合、望ましい動作を実現するためのベスト プラクティスは何ですか?

この質問は私のものと非常に似ていますが、答えは彼の試みがうまくいかず、私にとって十分な解決策を提供しなかった理由を示しているだけです.

Visitor Patternを使用して動作させることも試みましたが、その例では、 Base クラス (または少なくともインターフェイス) が Sub について知る必要があるようです。

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

swift - 動的ディスパッチの使用を増やすと、コンパイル時間が短縮されますか?

Swift では、コンパイル時間が非常に遅くなり、プロジェクトのコード量が増加します。そこで、その時間を短縮する方法を探していました。1 つのアプローチは、次のような言語キーワードを使用するfinalstatic、この場合は静的および動的ディスパッチを使用してコンパイラがコードを処理する方法を変更することです。

しかし、私が読んだ限りでは、実行時のオーバーヘッドを回避して動的ディスパッチを減らす方が良いです

したがって、私の最初の疑問は、より動的なディスパッチを使用して実行時にできることをすべて実行すると、実行時のオーバーヘッドを犠牲にしてコンパイル時間を短縮できるかどうかです。

私の 2 番目の疑問は、実行時のオーバーヘッドが非常に悪いということですか? オーバーヘッドを減らすためにコンパイル時間を犠牲にすることができると思いますか?