アーリーバインディングとレイトバインディングの違いは何ですか?
8 に答える
簡単に言うと、アーリー(または静的)バインディングはコンパイル時バインディングを指し、レイト(または動的)バインディングはランタイムバインディング(たとえば、リフレクションを使用する場合)を指します。
コンパイルされた言語では、違いは明白です。
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の既存のインスタンスを取得しようとすると、エラーが返された場合は、エラーハンドラーで新しいインスタンスを作成できます。
インタプリタ言語では、違いはもう少し微妙です。
ルビー:
# 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
アーリー バインディングでは、コンパイラは子とティーンエイジャーのすべてのメソッドにアクセスできますが、レイト バインディング (実行時) では、実行時にオーバーライドされるメソッドをチェックします。
したがって、メソッド 1 (子から -- アーリー バインディング) は、実行時にアダルトからのメソッド 1 によってオーバーライドされます (レイト バインディング)。
child に method1 がない場合、メインのコードはコンパイルされないことに注意してください。