\r\n\r\n
多型に関連する概念として、アーリーバインディングとレイトバインディングがある。アーリーバインドはコンパイル時に、レイトバインドは実行時に発生します。アーリーバインディングとレイトバインディングの重要な違いは、アーリーバインディングはクラス情報を使ってメソッドコールを解決するのに対し、レイトバインディングはオブジェクトを使ってメソッドコールを解決することである。
Javaなどのプログラミング言語は、オブジェクト指向プログラミング(OOP)をサポートしています。オブジェクトを使ってプログラムやソフトウェアを構築するためのパラダイムである。ソフトウェアには、複数のオブジェクトが存在します。これらのオブジェクトは互いに接続され、メッセージの受け渡しにメソッドを使用します。それぞれのオブジェクトには、特徴や振る舞いがあります。その特徴は、属性や特性で表現される。動作はメソッドで記述されます。対象となる生徒は、名前、年齢などの特徴を持つことができ、属性で表現される。オブジェクトの学生は、学習、読み取りなどの動作を持つことができ、メソッドによって特徴付けられる。OOPの主な柱の1つはポリモーフィズムである。これにより、オブジェクトを複数の方法で表現することができます。アーリーバインディングとレイトバインディングは、ポリモーフィズムにおける2つの概念である。オーバーロードされたメソッドは、早期バインディングバインディングを使用してバインドされます。書き換えたメソッドはレイトバインディングでバインドされます。
1. 概要と主な違い 2. 早縛りとは 3. 遅縛りとは 4. 早縛りと遅縛りの類似点 5. 横並び比較 - 表形式での早縛りと遅縛り 6. まとめ
初期バインディングでは、クラス情報がメソッド呼び出しの解決に使用されます。アーリーバインドはコンパイル時に発生する。静電結合とも呼ばれる。このプロセスでは、プログラムが実際に実行される前にバインディングが発生します。オーバーロードされたメソッドは、早期バインディングバインディングを使用してバインドされます。以下のプログラムをご参照ください。
図01 グレードの計算
図02:アーリーバインドマスタープログラム
上のプログラムによると、Calculationクラスには、2つの整数値を受け取るaddメソッドと、2つの倍精度値を受け取るaddメソッドがあります。メインプログラムでは、Calculationタイプのオブジェクトが作成されます。2つの整数が渡されると、2つの整数を受け付けるaddメソッドが呼び出される。addメソッドに2つのdouble値が渡されると、2つのdouble値に対応するメソッドが呼び出されます。この結合処理は、コンパイル時に行われる。必要な情報を実行前にすべて把握することで、プログラムの実行効率と速度を向上させることができます。
ポストバインディングでは、メソッド呼び出しを解決するためにオブジェクトが使用されます。遅延バインディングは実行時に発生します。ダイナミックバインディングとも呼ばれる。この処理では、プログラムの実行時に結合が行われる。書き換えたメソッドはポストバインディングでバインドされます。以下のプログラムをご参照ください。
図03:Shapeクラス
図04:ラウンドカテゴリー
図05:トライアングルカテゴリー
図06:ポストバインディングマスタープログラム
上のプログラムによると、Shapeクラスはdrawメソッドを持っています。Circle と Triangle クラスは Shape クラスを継承しています。したがって、この2つのクラスは、Shapeクラスのプロパティとメソッドを継承することができます。Shapeクラスは基本クラスです。クラスは派生クラスとサークルクラスです。円クラスと三角クラスは、それぞれ独自のdrawメソッドの実装を持っています。そのため、Shapeクラスのdrawメソッドは派生クラスのdrawメソッドにオーバーライドされます。
メインプログラムでは、Shape型の参照変数sを作成します。コンパイル時に、コンパイラはベースクラスのdrawメソッドのみを参照します。実行時には、異なる描画メソッドが実行されます。まず、sはShape型のオブジェクトを指すことになる。このように、Shapeクラスのdrawメソッドが呼び出されます。すると、sはCircle型のオブジェクトを指し、Circleクラスのdrawメソッドが呼び出されます。最後に、sはTriangle型のオブジェクトを指し、Triangleクラスのdrawメソッドが呼び出されます。メソッドの呼び出しは、オブジェクトに依存します。したがって、このオブジェクトは、後のバインディングのメソッド呼び出しを解決するために使用されます。バインディングに必要な情報は実行時に提供されるため、以前のバインディングと比較すると実行速度が遅くなります。
アーリーバインディングとレイトバインディング | |
コンパイル時に発生するメソッド呼び出しをクラス情報を使って解決する処理をアーリーバインディングと呼びます。 | 実行時に発生したメソッド呼び出しをオブジェクトで解決する処理をポストバインディングと呼びます。 |
バインディングタイム | |
アーリーバインドはコンパイル時に発生する。 | 遅延バインディングは実行時に発生します。 |
機能 | |
アーリーバインディングでは、クラス情報を使ってメソッドの呼び出しを解決します。 | ポストバインディングでは、メソッドの呼び出しを解決するためにオブジェクトを使用します。 |
同義語 | |
アーリーバインディングはスタティックバインディングとも呼ばれる。 | ポストバインディングは、ダイナミックバインディングとも呼ばれる。 |
発生状況 | |
オーバーロードされたメソッドは、早期バインディングバインディングを使用してバインドされます。 | 書き換えたメソッドはポストバインディングで束縛する。 |
実行速度 | |
早期のバインディングは実行速度が速い。 | ポストバインディングの実行速度が遅い。 |
ソフトウェア開発では、一般的にOOPが使われている。OOPの大きな柱のひとつがポリモーフィズムである。アーリーバインディングとレイトバインディングの両方が関係します。アーリーバインドはコンパイル時に、レイトバインドは実行時に発生する。メソッドオーバーローディングでは、アーリーバインディングでバインディングが行われます。メソッド書き換えでは、レイトバインディングでバインディングを行う。アーリーバインディングとレイトバインディングの違いは、アーリーバインディングはクラス情報を使ってメソッドコールを解決するのに対し、レイトバインディングはオブジェクトを使ってメソッドコールを解決することです。