Was ist der Unterschied zwischen früher und später Bindung?

81

Was ist der Unterschied zwischen früher und später Bindung?

James A. Rosen
quelle
4
Wäre es falsch, früh = direkter Funktionsaufruf zu sagen, während spät = Funktionsaufruf über einen Funktionszeiger? Es überrascht mich immer wieder, wie Programmierer einfache Konzepte aufgreifen und sie viel komplexer erscheinen lassen als sie sind (als Beweis für Intelligenz?). Das Programmieren ist von Natur aus ein sehr einfaches Studienfeld, bis Sie sich mit der Herstellung eines Float-Typs oder der Entwicklung von Compilern befassen.
Bob Blogge
Mögliches Duplikat der frühen und späten Bindung
Berkeley

Antworten:

57

Die kurze Antwort lautet, dass sich die frühe (oder statische) Bindung auf die Bindung zur Kompilierungszeit und die späte (oder dynamische) Bindung auf die Laufzeitbindung bezieht (z. B. wenn Sie Reflection verwenden).

Christian Hagelid
quelle
8
Der Wikipedia-Artikel über späte Bindung ( en.wikipedia.org/wiki/Late_binding ) besagt jedoch, dass "späte Bindung oft mit dynamischem Versand verwechselt wird, aber es gibt signifikante Unterschiede". Also sind sie gleich oder nicht? Wenn sie gleich sind, muss diese Wikipedia-Seite geändert werden.
Alexander Bird
2
Bessere Stackoverflow-Antwort hier stackoverflow.com/questions/484214/early-and-late-binding
Baggers
18

In kompilierten Sprachen ist der Unterschied stark.

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);

Im ersten Beispiel kann der Compiler zur Kompilierungszeit alle möglichen netten Dinge erledigen. Im zweiten Fall muss man nur hoffen, dass jeder, der die Methode verwendet, dies verantwortungsbewusst tut. (Natürlich unterstützen neuere JVMs die Class<? extends Foo> klassStruktur, wodurch dieses Risiko erheblich reduziert werden kann.)

Ein weiterer Vorteil ist, dass IDEs einen Hotlink zur Klassendefinition erstellen können, da diese direkt in der Methode deklariert ist. Der Aufruf von create_something (Foo) ist möglicherweise sehr weit von der Methodendefinition entfernt. Wenn Sie sich die Methodendefinition ansehen, ist es möglicherweise hilfreich, die Implementierung zu sehen.

Der Hauptvorteil der späten Bindung besteht darin, dass sie Dinge wie die Inversion der Kontrolle sowie bestimmte andere Verwendungen von Polymorphismus und Ententypisierung erleichtert (wenn Ihre Sprache solche Dinge unterstützt).

James A. Rosen
quelle
6

Entnommen direkt von http://word.mvps.org/fAQs/InterDev/EarlyvsLateBinding.htm

Es gibt zwei Möglichkeiten, mithilfe der Automatisierung (oder OLE-Automatisierung) eine andere Anwendung programmgesteuert zu steuern.

Bei der späten Bindung wird CreateObject verwendet, um eine Instanz des Anwendungsobjekts zu erstellen, die Sie dann steuern können. So erstellen Sie beispielsweise eine neue Instanz von Excel mithilfe der späten Bindung:

 Dim oXL As Object
 Set oXL = CreateObject("Excel.Application")

Um eine vorhandene Instanz von Excel zu bearbeiten (wenn Excel bereits geöffnet ist), verwenden Sie GetObject (unabhängig davon, ob Sie eine frühe oder eine späte Bindung verwenden):

 Dim oXL As Object
 Set oXL = GetObject(, "Excel.Application")

Um die frühzeitige Bindung zu verwenden, müssen Sie in Ihrem Projekt zunächst einen Verweis auf die Anwendung festlegen, die Sie bearbeiten möchten. Im VB-Editor einer Office-Anwendung oder in VB selbst wählen Sie dazu Extras + Referenzen und die gewünschte Anwendung aus der Liste aus (z. B. „Microsoft Excel 8.0-Objektbibliothek“).

So erstellen Sie eine neue Excel-Instanz mithilfe der frühen Bindung:

 Dim oXL As Excel.Application
 Set oXL = New Excel.Application

In beiden Fällen können Sie übrigens zuerst versuchen, eine vorhandene Excel-Instanz abzurufen. Wenn dies einen Fehler zurückgibt, können Sie eine neue Instanz in Ihrem Fehlerhandler erstellen.

Ed S.
quelle
3
Ich weiß, dass diese Antwort alt ist und von einem anderen Ort stammt, aber sie ist nicht korrekt. Eine späte Bindung impliziert die Verwendung von CreateObject, aber CreateObject impliziert nicht unbedingt eine späte Bindung. Die Bindung gilt nicht für die Methode zum Instanziieren eines Objekts, sondern nur für die Deklaration. Wenn Sie Ihr Objekt als "Excel.Application" deklarieren, spielt es keine Rolle, wie Sie es instanziieren. Ich verwende CreateObject immer, um Objektreferenzen auf externe Bibliotheken zu instanziieren. Auf diese Weise kann ich zwischen früher und später Bindung wechseln und muss nur eine Zeile (nicht zwei) wechseln - die Zeile, die das Objekt deklariert.
JimmyPena
6

Ähnliche, aber detailliertere Antwort aus dem Herbert Schildt C ++ Buch: -

Frühe Bindung bezieht sich auf Ereignisse, die zur Kompilierungszeit auftreten. Im Wesentlichen tritt eine frühe Bindung auf, wenn alle zum Aufrufen einer Funktion erforderlichen Informationen zur Kompilierungszeit bekannt sind. (Anders ausgedrückt bedeutet frühes Binden, dass ein Objekt und ein Funktionsaufruf während der Kompilierung gebunden werden.) Beispiele für frühes Binden sind normale Funktionsaufrufe (einschließlich Standardbibliotheksfunktionen), überladene Funktionsaufrufe und überladene Operatoren. Der Hauptvorteil einer frühen Bindung ist die Effizienz. Da alle zum Aufrufen einer Funktion erforderlichen Informationen zur Kompilierungszeit ermittelt werden, sind diese Arten von Funktionsaufrufen sehr schnell.

Das Gegenteil von früher Bindung ist späte Bindung. Späte Bindung bezieht sich auf Funktionsaufrufe, die erst zur Laufzeit aufgelöst werden. Virtuelle Funktionen werden verwendet, um eine späte Bindung zu erreichen. Wie Sie wissen, wird beim Zugriff über einen Basiszeiger oder eine Referenz die tatsächlich aufgerufene virtuelle Funktion durch den Objekttyp bestimmt, auf den der Zeiger zeigt. Da dies in den meisten Fällen nicht zur Kompilierungszeit ermittelt werden kann, werden das Objekt und die Funktion erst zur Laufzeit verknüpft. Der Hauptvorteil der späten Bindung ist die Flexibilität. Im Gegensatz zur frühen Bindung können Sie mit der späten Bindung Programme erstellen, die auf Ereignisse reagieren können, die während der Ausführung des Programms auftreten, ohne dass eine große Menge an "Notfallcode" erstellt werden muss. Beachten Sie, dass eine späte Bindung zu etwas langsameren Ausführungszeiten führen kann, da ein Funktionsaufruf erst zur Laufzeit aufgelöst wird. Heute jedoch

Pancuz Kumar
quelle
1
"Das Objekt und die Funktion werden erst zur Laufzeit verknüpft." Diese Anweisung scheint zu implizieren, dass ein Objekt vor der Laufzeit vorhanden ist. Sind Objekte nicht reine Laufzeitentitäten? Es ist die Klasse des Objekts, die zur Kompilierungszeit vorhanden ist. Dies könnte besser ausgedrückt werden als "der Funktionsaufruf und seine Implementierung werden erst zur Laufzeit verknüpft"
programmerravi
Ein Beispiel für eine späte Bindung ist der Polymorphismus (in OOP), bei dem wir Schnittstellen oder abstrakte Klassen verwenden und dann zur Laufzeit daran binden.
Mohamad Mirzadeh
3

In interpretierten Sprachen ist der Unterschied etwas subtiler.

Rubin:

# 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)

Da Ruby (im Allgemeinen) nicht kompiliert ist, gibt es keinen Compiler, der die raffinierten Vorarbeiten erledigt. Das Wachstum von JRuby bedeutet jedoch, dass heutzutage mehr Ruby kompiliert wird, sodass es sich eher wie Java oben verhält.

Das Problem mit IDEs besteht weiterhin: Eine Plattform wie Eclipse kann Klassendefinitionen nachschlagen, wenn Sie sie fest codieren, aber nicht, wenn Sie sie dem Aufrufer überlassen.

Inversion-of-Control ist in Ruby nicht besonders beliebt, wahrscheinlich aufgrund seiner extremen Laufzeitflexibilität. Rails nutzt jedoch die späte Bindung, um den Konfigurationsaufwand für den Start Ihrer Anwendung zu verringern.

James A. Rosen
quelle
Dieser Punkt gilt auch für kompilierte Sprachen, die Komponenten enthalten können, die JIT kompiliert und zur Laufzeit enthalten sind, um Plugins oder dynamische Frameworks zu implementieren. Einige kanonische Beispiele hierfür gibt es in Java und natürlich auch in Ruby und Python. Ein extremes Beispiel ist Erlang, wo die Laufzeit zwei Versionen eines Moduls gleichzeitig für Live-Upgrades / Downgrades laden kann. Obwohl viel Erlang-Code (die meisten?) Als statisch typisierte reine Funktionen geschrieben ist, erfordern die Laufzeitanforderungen späte Bindung und dynamische Typen unter der Haube.
zxq9
0
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();
}

Dies wird ausgedruckt

adult1
child1

Bei der frühen Bindung hat der Compiler Zugriff auf alle Methoden in Kind und Teenager, bei der späten Bindung (zur Laufzeit) wird jedoch nach Methoden gesucht, die zur Laufzeit überschrieben werden.

Daher wird Methode1 (vom Kind - frühe Bindung) zur Laufzeit von der Methode1 vom Erwachsenen überschrieben (späte Bindung). Dann wird Methode1 vom Kind implementiert, da es im Teenager keine Methode1 in Methode1 gibt.

Beachten Sie, dass der Code im Main nicht kompiliert werden würde, wenn das Kind keine Methode1 hätte.

JBOND
quelle
0

Der Polymorphismus zur Kompilierungszeit wird auch als Überladung oder frühe Bindung oder statische Bindung bezeichnet, wenn wir denselben Methodennamen mit unterschiedlichen Verhaltensweisen haben. Durch die Implementierung des Mehrfachprototyps derselben Methode tritt darin ein unterschiedliches Verhalten auf. Frühe Bindung bezieht sich auf die erste Zusammenstellung des Programms. Aber im späten Bindungsobjekt tritt die Laufzeit im Programm auf. Wird auch als dynamische Bindung oder Überschreiben oder Laufzeitpolymorphismus bezeichnet.

Ghousepeer
quelle