Frage

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

War es hilfreich?

Lösung

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

Andere Tipps

Bei kompilierten Sprachen ist der Unterschied deutlich.

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 tun.Im zweiten Fall muss man einfach darauf hoffen, dass derjenige, der die Methode anwendet, dies verantwortungsvoll tut.(Natürlich unterstützen neuere JVMs das Class<? extends Foo> klass Struktur, die dieses Risiko erheblich reduzieren kann.)

Ein weiterer Vorteil besteht darin, dass IDEs einen Hotlink zur Klassendefinition erstellen können, da diese direkt dort in der Methode deklariert wird.Der Aufruf von create_something(Foo) könnte sein sehr weit von der Methodendefinition entfernt, und wenn Sie sich die Methodendefinition ansehen, wäre es vielleicht schön, die Implementierung zu sehen.

Der Hauptvorteil der späten Bindung besteht darin, dass sie Dinge wie die Umkehrung der Kontrolle sowie bestimmte andere Anwendungen von Polymorphismus und Ententypisierung (sofern Ihre Sprache solche Dinge unterstützt) einfacher macht.

Direkt entnommen aus http://word.mvps.org/fAQs/InterDev/EarlyvsLateBinding.htm

Es gibt zwei Möglichkeiten, Automatisierung (oder OLE -Automatisierung) zu verwenden, um eine andere Anwendung programmatisch zu steuern.

Die verspätete Bindung verwendet CreateObject, um das Anwendungsobjekt zu erstellen und zu instanz, das Sie dann steuern können.Zum Beispiel, um eine neue Instanz von Excel mit einer späten Bindung zu erstellen:

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

Andererseits würden Sie GetObject verwenden (unabhängig davon, ob Sie eine frühe oder verspätete Bindung verwenden), um eine vorhandene Instanz von Excel zu manipulieren (wenn Excel bereits geöffnet ist):

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

Um frühzeitig Bindung zu verwenden, müssen Sie zunächst eine Referenz in Ihr Projekt auf die Anwendung festlegen, die Sie manipulieren möchten.Im VB -Editor einer Office -Anwendung oder in VB selbst wählen Sie dies, indem Sie Tools + Referenzen auswählen und die gewünschte Anwendung aus der Liste auswählen (z.„Objektbibliothek von Microsoft Excel 8.0“).

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

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

In beiden Fällen können Sie zuerst versuchen, eine vorhandene Instanz von Excel zu erhalten, und wenn dies einen Fehler zurückgibt, können Sie in Ihrem Fehlerbehandlungen eine neue Instanz erstellen.

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

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

Das Gegenteil der frühen Bindung ist die späte Bindung.Die verspätete Bindung bezieht sich auf Funktionsaufrufe, die erst bis 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 zur Kompilierungszeit nicht 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 ermöglicht es Ihnen eine verspätete Bindung, Programme zu erstellen, die auf Ereignisse reagieren können, die auftreten, während das Programm ausgeführt wird, ohne eine große Menge an "Notfallcode" erstellen zu müssen. Denken Sie daran, dass eine verspätete Bindung, da ein Funktionsaufruf erst bis zur Laufzeit aufgelöst wird, etwas langsamere Ausführungszeiten sorgen kann.Heutzutage haben schnelle Computer jedoch die Ausführungszeiten im Zusammenhang mit der späten Bindung erheblich verkürzt.

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, wodurch es sich eher wie Java verhält (siehe oben).

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

Inversion-of-Control ist in Ruby nicht besonders beliebt, wahrscheinlich wegen seiner extremen Laufzeitflexibilität, aber Rails nutzt die späte Bindung in großem Umfang, um den Konfigurationsaufwand zu reduzieren, der zum Starten Ihrer Anwendung erforderlich ist.

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 wird der Compiler Zugriff auf alle Methoden in Kind und Teenager haben, aber in verspäteter Bindung (zur Laufzeit) prüft er nach Methoden, die zur Laufzeit außer Kraft gesetzt werden.

Daher wird Methode1 (von Child - Frühe Bindung) von der Methode1 von Erwachsenen zur Laufzeit (verspätete Bindung) überschrieben, und implementiert Methode1 von Child, da es in der Methode 1 im Teenager keine Methode1 gibt.

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

Der Kompilierzeitpolymorphismus wird auch als Überladung oder frühe Bindung oder statische Bindung bezeichnet, wenn wir denselben Methodennamen mit unterschiedlichem Verhalten haben.Durch die Implementierung mehrerer Prototypen derselben Methode kommt es zu unterschiedlichem Verhalten.Unter Early Binding versteht man die erste Kompilierung des Programms.Bei der späten Bindung des Objekts erfolgt die Laufzeit jedoch im Programm.Wird auch als dynamische Bindung oder Überschreibung oder Laufzeitpolymorphismus bezeichnet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top