6

動的言語(Python、ruby)と静的型言語(java、C ++)でのランタイム動的バインディングとクラス継承の概念を明確にしようとしています。私は自分が正しいかどうかわかりません。

PythonやRubyなどの動的言語では、ランタイム動的バインディングはダックタイピングとして実装されます。インタプリタがオブジェクトのタイプをチェックするとき、オブジェクトのタイプをチェックするのではなく、オブジェクトが特定のメソッド(または動作)を持っているかどうかをチェックします。実行時の動的バインディングは、クラスの継承を意味するものではありません。クラスの継承は、PythonとRubyのコードコピーを減らすだけです。

JavaやC++などの静的型付き言語では、ランタイム動的バインディングはクラス継承のみを取得できます。クラス継承は、ここでのコードコピーを減らすだけでなく、ランタイム動的バインディングを実装するためにも使用されます。

要約すると、クラス継承と実行時動的バインディングは2つの異なる概念です。PythonとRubyでは、まったく異なります。JavaとC++では、それらは一緒に混合されます。

私は正しいですか?

4

1 に答える 1

3

実行時の動的バインディングは、概念的にはクラスの継承とはまったく異なるという点で正しいです。

しかし、あなたの質問を読み直してみると、「JavaとC ++、ランタイム動的バインディングはクラス継承として実装されている」ということに同意するとは思いません。クラスの継承は、既存のクラスからの既存の動作を含む、より広範な動作の定義にすぎません。さらに、ランタイムバインディングは、必ずしもオブジェクト指向とは関係ありません。単に遅延メソッド解決を参照することができます。

クラス継承とは、オブジェクトがどのように構築されるかについての「テンプレート」を指し、連続するサブクラスでますます洗練された動作をします。ランタイム動的バインディングは、メソッドへの参照(たとえば)が実行時まで延期されることを示す単なる方法です。特定の言語では、特定のクラスがランタイム動的バインディングを利用する場合がありますが、継承されたクラスはコンパイル時に解決されます。

一言で言えば、継承とは、オブジェクトの定義または青写真を指します。ランタイム動的バインディングは、最も基本的なレベルでは、実行時にメソッド呼び出しを解決するためのメカニズムにすぎません。

編集私はこれについて1つのポイントを明確にする必要があります:Javaはオーバーライドされたクラスメソッドに動的バインディングを実装しますが、C ++は実行時にポリモーフィズムによって型を決定するため、動的バインディングはクラスの継承と「関係がない」と言うのは正確ではありません。「マクロ」レベルでは、それらは本質的に関連していませんが、特定の言語がその継承メカニズムでそれを活用する場合があります。

于 2012-10-04T14:58:12.680 に答える