アーリーバインディングとレイトバインディングの違いは何ですか?
アーリーバインディングとレイトバインディングの違いは何ですか?
回答:
簡単に言うと、アーリー(または静的)バインディングはコンパイル時バインディングを指し、レイト(または動的)バインディングはランタイムバインディングを指します(たとえば、リフレクションを使用する場合)。
コンパイルされた言語では、違いは明白です。
Java:
//early binding:
public create_a_foo(*args) {
return new Foo(args)
}
my_foo = create_a_foo();
//late binding:
public create_something(Class klass, *args) {
klass.new_instance(args)
}
my_foo = create_something(Foo);
最初の例では、コンパイラーはコンパイル時にあらゆる種類のきちんとしたことを実行できます。第二に、あなたはただその方法を使う人は誰でも責任を持ってそうすることを期待する必要があります。(もちろん、新しいJVMはClass<? extends Foo> klass
構造をサポートしているため、このリスクを大幅に減らすことができます。)
もう1つの利点は、IDEがクラス定義にホットリンクできることです。これは、クラス定義がメソッド内で宣言されているためです。create_something(Foo)の呼び出しは、メソッド定義から非常に離れている可能性があります。メソッド定義を確認している場合は、実装を確認するとよいでしょう。
遅延バインディングの主な利点は、制御の反転などのほか、ポリモーフィズムやダックタイピングの特定の他の使用法(言語がそのようなものをサポートしている場合)が容易になることです。
http://word.mvps.org/fAQs/InterDev/EarlyvsLateBinding.htmから直接取得
自動化(またはOLEオートメーション)を使用して別のアプリケーションをプログラムで制御するには、2つの方法があります。
実行時バインディングは、CreateObjectを使用して、アプリケーションオブジェクトのインスタンスを作成し、それを制御できます。たとえば、遅延バインディングを使用してExcelの新しいインスタンスを作成するには:
Dim oXL As Object Set oXL = CreateObject("Excel.Application")
一方、Excelの既存のインスタンスを操作するには(Excelが既に開いている場合)、GetObjectを使用します(アーリーバインディングとレイトバインディングのどちらを使用しているかに関係なく)。
Dim oXL As Object Set oXL = GetObject(, "Excel.Application")
アーリーバインディングを使用するには、最初に、操作するアプリケーションへの参照をプロジェクトに設定する必要があります。OfficeアプリケーションのVBエディターまたはVB自体で、[ツール] + [参照]を選択し、リストから目的のアプリケーション(「MicrosoftExcel 8.0オブジェクトライブラリ」など)を選択することで、これを実行します。
アーリーバインディングを使用してExcelの新しいインスタンスを作成するには:
Dim oXL As Excel.Application Set oXL = New Excel.Application
いずれの場合も、ちなみに、最初にExcelの既存のインスタンスを取得しようとすると、エラーが返された場合は、エラーハンドラーで新しいインスタンスを作成できます。
ハーバートシルトC ++の本からの同様ですがより詳細な答え:-
早期バインディングとは、コンパイル時に発生するイベントを指します。本質的に、早期バインディングは、関数を呼び出すために必要なすべての情報がコンパイル時にわかっている場合に発生します。(言い換えると、アーリーバインディングとは、コンパイル中にオブジェクトと関数呼び出しがバインドされることを意味します。)アーリーバインディングの例には、通常の関数呼び出し(標準ライブラリ関数を含む)、オーバーロードされた関数呼び出し、オーバーロードされた演算子が含まれます。早期バインディングの主な利点は効率です。関数を呼び出すために必要なすべての情報はコンパイル時に決定されるため、これらのタイプの関数呼び出しは非常に高速です。
初期バインディングの反対は、遅延バインディングです。遅延バインディングとは、実行時まで解決されない関数呼び出しを指します。仮想関数は、遅延バインディングを実現するために使用されます。ご存知のように、アクセスがベースポインターまたは参照を介して行われる場合、実際に呼び出される仮想関数は、ポインターが指すオブジェクトのタイプによって決定されます。ほとんどの場合、これはコンパイル時に決定できないため、オブジェクトと関数は実行時までリンクされません。遅延バインディングの主な利点は柔軟性です。遅延バインディングとは異なり、遅延バインディングを使用すると、プログラムの実行中に発生したイベントに応答できるプログラムを作成できます。大量の「緊急コード」を作成する必要はありません。関数呼び出しは実行時まで解決されないため、バインディングが遅れると実行時間が多少遅くなる可能性があることに注意してください。しかし今日、
インタープリター言語では、違いはもう少し微妙です。
ルビー:
# early binding:
def create_a_foo(*args)
Foo.new(*args)
end
my_foo = create_a_foo
# late binding:
def create_something(klass, *args)
klass.new(*args)
end
my_foo = create_something(Foo)
Rubyは(一般的に)コンパイルされていないので、気の利いた先行作業を行うコンパイラはありません。JRubyの成長は、最近より多くのRubyがコンパイルされることを意味しますが、上記のようにJavaのように動作します。
IDEの問題は依然として存在します。Eclipseのようなプラットフォームは、クラス定義をハードコーディングすると検索できますが、呼び出し元に任せると検索できません。
制御の反転は、おそらく実行時の柔軟性が非常に高いため、Rubyではそれほど人気がありませんが、Railsは遅延バインディングを最大限に活用して、アプリケーションを実行するために必要な構成の量を減らします。
public class child()
{ public void method1()
{ System.out.println("child1");
}
public void method2()
{ System.out.println("child2");
}
}
public class teenager extends child()
{ public void method3()
{ System.out.println("teenager3");
}
}
public class adult extends teenager()
{
public void method1()
{ System.out.println("adult1);
super.method1();
}
}
//In java
public static void main(String []args)
{ ((teenager)var).method1();
}
これは印刷されます
adult1
child1
早期バインディングでは、コンパイラは子とティーンエイジャーのすべてのメソッドにアクセスできますが、遅延バインディング(実行時)では、実行時にオーバーライドされるメソッドをチェックします。
したがって、method1(子から-早期バインディング)は、実行時に大人からのmethod1によってオーバーライドされます(遅延バインディング)。ティーンエイジャーのmethod1にはmethod1がないため、子からのmethod1を実装します。
子にmethod1がない場合、メインのコードはコンパイルされないことに注意してください。
コンパイル時のポリモーフィズムは、同じメソッド名で動作が異なる場合、オーバーロード、早期バインディング、または静的バインディングとも呼ばれます。同じメソッドの複数のプロトタイプを実装することにより、異なる動作が発生します。アーリーバインディングとは、プログラムの最初のコンパイルを指します。しかし、遅延バインディングオブジェクトでは、ランタイムはプログラムで発生します。動的バインディングまたはオーバーライドまたはランタイムポリモーフィズムとも呼ばれます。