Was ist der Unterschied zwischen früher und später Bindung?
binding
dynamic-binding
static-binding
James A. Rosen
quelle
quelle
Antworten:
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).
quelle
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> klass
Struktur, 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).
quelle
Entnommen direkt von http://word.mvps.org/fAQs/InterDev/EarlyvsLateBinding.htm
quelle
Ä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
quelle
In interpretierten Sprachen ist der Unterschied etwas subtiler.
Rubin:
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.
quelle
Dies wird ausgedruckt
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.
quelle
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.
quelle