多型のメカニズムとその実装の重要性について、「Uターン」

より転載:共有のため、https://hesey.wang/2010/12/significance-and-implementation-of-polymorphism.html感謝

マルチステートメカニズムとは何ですか?

親クラスまたは可能なインタフェース定義参照変数であるオブジェクト実装クラスのサブクラスまたはインスタンスを指し、およびプロシージャ・コール実行時バインディングのみ動的方法は、特定の方法は、オブジェクト変数ポイントを、メモリは参照されている達成するためにそのオブジェクトの操作方法ではなく、定義された参照型変数の方法。

意味とマルチ状態メカニズムに

オブジェクト指向プログラミング(オブジェクト指向プログラミング、OOP)では、多状態メカニズムは、間違いなくその最もユニークな機能であっても多状態プログラミングはOOP呼び出すことはできません使用していない、と言うことができます。一部の人々は、オブジェクト指向プログラミングとオブジェクト指向プログラミング言語の使用は、2つの異なるものです、と言う理由です。

多型は、より緩和の下でそれにWikipediaの定義を厳密な定義はありません。

サブタイプの多型は、ほぼ普遍的に、オブジェクト指向プログラミングの文脈においてだけ多型と呼ばれる、として表示すると、別のタイプ、B.同様に使用することが一種、Aの能力であります

サブタイプおよびサブタイプ

ここで私が言及したいと思いサブタイプ(サブタイプ)の単語とサブクラス(サブクラス)限り、クラスAがクラスBの継承を実現するために、キーワードの使用を拡張して、その後、私たちは、クラスAを言うことができ、簡単に違いを、クラスBは、サブクラスのサブクラスである限り、相続の構文として、サブクラスの関係があり、文法的なレベルでの言葉です。

サブタイプではないだけで、構文の継承が必要ですサブクラス、より厳しい要件があり、親クラスのメソッドを書き換えるのサブクラス(オーバーライド)がある場合、コンテンツは、それが呼び出され、親クラスのオリジナルのセマンティクスを遵守しなければならない書き換え、その後、依頼します同じ効果とアクションの後に親クラスの方向に実装する必要があります。

2の比較は、一点を強調するようなものです:唯一のサブタイプの多型が理にかなってサブクラスであることを確認します。

第二に、多形性のメカニズム

基本的に2つの方法で多型:

  • (静的多形としても知られる)コンパイル時ポリモーフィズム

  • (動的多形としても知られる)ランタイム多型

オーバーロード(過負荷)コンパイル時の多型は、コンパイル時に決定されたコンパイル時の多型の例、呼び出しを決定するランタイム実行方法。

私たちは通常、あること、多型が実行されている参照の多型性を参照して、コンパイル時に特定のメソッドの呼び出しかどうかは不明である、実行するかを決定するために遅れています。時には多型法はとしても知られている理由はここにある遅延理由。

ウィキペディア多型の挙動は以下のように記述されています。

業界(オブジェクト指向プログラミング理論)における多型の主な用途は、メソッド、フィールド、または同じ名前のプロパティの呼び出しに応答する異なる種類に属するオブジェクトの能力は、適切なタイプ固有の動作に応じてそれぞれです。

以下の簡単な機構多型ランタイム(以下、多型と呼びます)。

ポリモーフィック通常2つの方法:

  • サブクラスは、(拡張)親クラスを継承しています

  • クラスが実装するインタフェース(実装)

どちらにしても、場所のコアはリライトするか、実行時の実行時に異なる効果を達成するために、インタフェースのメソッドに親クラスのメソッドを実現することです。:使用多型に、オブジェクトを宣言するときのルールに従う必要があります実際の型を作成するために、常に親クラス型またはインタフェース型宣言を。例えば、我々はArrayListオブジェクトを作成したいと、文は、この文のように使用する必要があります。

List<> list =new ArrayList<>();
//而不是
ArrayList<> list =new ArrayList<>();

//先使用父类类型或接口类型,例如某方法应该写成:
public void doSomething(List list);
//而不是
public void doSomething(ArrayList list);

この文の最大の利点は、ということである構造の柔軟性ある日、私は私がのLinkedListと交換できるようにしたい、ArrayListのの特性は私の要件を満たすことができないと考えられる場合は、あなたが唯一の場所で作成された新しいオブジェクトに変更され、新しいのArrayList()を配置する必要があります。 LinkedListのは、他のコードと変更されませんすることはできません。

プログラマ(プログラム)は、事前にオブジェクトの正確な型を知っている必要はありません、そのため正確な動作は、実行時に決定された(これは、遅延バインディングまたは動的結合と呼ばれています)。

実際のクラスのプログラムの実装における動的なアプローチを呼び出すための仮想機会、それが呼ばれる渡します(また、後半に結合呼ばれる)動的結合このプロセスの自動実装メカニズムは、プログラマに対して透過的です。

第三に、多型の使用

ポリモーフィックの最大の使用は私がのためにと思って、設計とアーキテクチャの再利用、さらに、「デザインモード」が提唱プログラミングするためのインタフェースを代わりにプログラミングを実現するための典型的な例の多型をフルに活用しています。インタフェース定義関数定義およびコンポーネントは、実装に流れた後に残すことができる場合。インタフェースは、同時に複数の実装を持つことができ、さらには設計にしながらインタフェース(例えばArrayListの異なる特性の決定などは、まさにLinkedListの用途を達成するために)を実装する様々なを使用することができます。

4、ポリモーフィズムを実現

ここでは、ラン、簡単に仮想マシンの観点から、一例として、マルチステート、Java仮想マシン(Java仮想マシン、JVM)実装仕様の原則の実装について説明します。

JavaバイトコードのJVM実行では、タイプ情報が処理領域に格納され、一般的に物体の速度、情報の種類ポインタの面積を増加させる方法を最適化するメソッドを呼び出し、テーブルエントリへのポインタポイントは(このような方法を記録します呼ばれるメソッドテーブル)、テーブルは、対応する方法のそれぞれへのポインタです。

次のようにコンストラクタのテーブルには、次のとおりです。

Javaの単一継承するので、このクラスは、親クラスから継承することができますが、すべてのクラスが、彼らは、Objectクラスから継承されます。メソッドテーブル最初の方法は、オブジェクト・クラスに格納されたクラスの親クラスに続いて、方法自体の最後のクラスです。ここで重要なのは、その場所であるサブクラスが、その後、同じ名前のサブクラスとテーブルエントリを共有するスーパークラスメソッドのそれらを親クラスを書き換えた場合、それは親クラスとして認識されています。

唯一のことを注意非プライベートインスタンスメソッドが表示され、および静的なメソッドがここに表示されていない、その理由は理解しやすいです:静的メソッドはオブジェクトとは何の関係もない、メソッドは、インスタンスメソッドは、間接参照を必要とするのではなく、アドレスを直接参照することができます。

より詳細な話、静的メソッドはinvokestatic仮想マシン命令と呼ばれ、プライベートメソッドとコンストラクタはinvokespecial命令によって呼び出され、唯一の方法は、INVOKEVIRTUALとinvokeinterface命令はメソッドテーブルに表示されますと呼ばれています。

上記プロセスに配向特性( -親オブジェクト-サブクラス)ので、そうオフセットテーブル方式は常に固定されています。例えば、任意のクラスのために、この方法は、常に一定の値に等しいオフセットテーブル方式は、すべてのサブクラスは、親クラスのメソッドテーブルを継承し、オフセット方法は、親クラスの総数で定義されています固定値です。

メソッドテーブルエントリで、上述したように対応する方法、マルチ開始状態のクラスへのポインタです。

  • クラスA、クラスB、次いでAのサブクラス及び方法B、書き換え方法()、表Bの方法であり、ポインタポインティング方法は、方法Bの方法エントリの方法であると仮定する。

  • JVMは、常にから保証しながら、Aがあるために、方法そのメソッド・テーブルのメソッドは、独自の方法ではなく、クラスのロードすでにクラスローダを保証され、その親(の方法を指します正しいタイプの情報へのオブジェクト参照点)。

バインディングオフセット法のポインタが固定されている、ポインタは常に実際のドメインクラスのメソッドを指して、私たちは簡単にここで多型メカニズムを見つけることができます。

  • メソッド呼び出しは、実際には、シンボル参照の方法の最初の完全な例では、結果は符号オフセットテーブル方式として解釈されることで、解決されなければなりません。

  • オブジェクトエントリタイプ情報、クラスメソッドテーブル検索により得られた仮想マシンの参照ゾーンの方法。

  • ときに正式に親クラスのメソッドと呼ばれるサブクラスのオブジェクトの親クラスの型宣言、仮想メソッドテーブル真の機会クラスからこの時間(文は、親クラスであるが、実際にはこの種の情報は、に保存されているが、 、「検索」ここで使用される対応するポインタを(見つけるメソッドの名前でサブクラス情報)にのみに従って得ることができるオフセットされ、固定されたオフセット処理は、先に述べたように、実際には不向きですポインタ)、さらには実際のクラスの方法を対象とすることができます。

私たちの物語は、実際には、上記の手順は、多型を達成するための別の方法で、内部使用のみの継承メカニズムの多形性のためで、まだ終わっていません:インタフェースのコントラストが一層、ので、複雑さを実装するJavaの単一継承保証クラス間の線形関係、および同時にさえ困難で正確にオフセットポインタ方法を得るためにその結果、複数のインタフェースを実現することができます。したがって、JVMに、メソッド呼び出しの多型の例実際に2つの命令。

  • INVOKEVIRTUALメソッド宣言したクラスを呼び出すための指示;

  • invokeinterfaceのメソッドを呼び出す命令は、インタフェースを宣言しました。

メソッドを呼び出すときinvokeinterface命令、あなたは(もちろん、実際の実装は必ずしもそうではありません見つけるために、一定のオフセットリコースが、1つのことで正直いずれかを使用することはできません、JVM仕様では、この一見、異なるJVMを達成するための方法を正確に指定されていません。実装は)検索効率を向上させるためにさまざまな最適化アルゴリズムを持つことができます。私たちは、見ることができ、ほとんどの場合、低速のメソッド呼び出しのクラス参照よりもインターフェースの参照メソッドを呼び出して、パフォーマンスの面で。また、好ましい設計は常に正しい、もちろん、設計上の問題が探求するために、この資料の範囲内ではないが、どうやら特定の問題の具体的な分析はまだ良い選択肢とみなされないようインターフェースクラスとインタフェースの間で、教えてくれる。

おすすめ

転載: www.cnblogs.com/antonzhao/p/12446904.html
おすすめ