Jaka jest różnica między wczesnym a późnym wiązaniem?
Jaka jest różnica między wczesnym a późnym wiązaniem?
Odpowiedzi:
Krótka odpowiedź jest taka, że wczesne (lub statyczne) wiązanie odnosi się do wiązania czasu kompilacji, a późne (lub dynamiczne) wiązanie odnosi się do wiązania środowiska uruchomieniowego (na przykład w przypadku używania odbicia).
W językach kompilowanych różnica jest wyraźna.
Jawa:
//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);
W pierwszym przykładzie kompilator może robić różne fajne rzeczy w czasie kompilacji. Po drugie, musisz mieć tylko nadzieję, że ktokolwiek używa tej metody, robi to odpowiedzialnie. (Oczywiście nowsze maszyny JVM obsługują tę Class<? extends Foo> klass
strukturę, co może znacznie zmniejszyć to ryzyko).
Kolejną korzyścią jest to, że IDE mogą łączyć się z definicją klasy, ponieważ jest zadeklarowana bezpośrednio w metodzie. Wywołanie create_something (Foo) może być bardzo dalekie od definicji metody, a jeśli patrzysz na definicję metody, fajnie byłoby zobaczyć implementację.
Główną zaletą późnego wiązania jest to, że ułatwia takie rzeczy, jak odwrócenie kontroli, a także niektóre inne zastosowania polimorfizmu i pisania kaczego (jeśli twój język obsługuje takie rzeczy).
Pobrano bezpośrednio z http://word.mvps.org/fAQs/InterDev/EarlyvsLateBinding.htm
Istnieją dwa sposoby wykorzystania automatyzacji (lub automatyzacji OLE) do programowego sterowania inną aplikacją.
Późne wiązanie wykorzystuje metodę CreateObject do tworzenia i wystąpienia obiektu aplikacji, którym można następnie sterować. Na przykład, aby utworzyć nowe wystąpienie programu Excel przy użyciu późnego wiązania:
Dim oXL As Object Set oXL = CreateObject("Excel.Application")
Z drugiej strony, aby manipulować istniejącym wystąpieniem programu Excel (jeśli program Excel jest już otwarty), należy użyć GetObject (niezależnie od tego, czy używasz wczesnego czy późnego wiązania):
Dim oXL As Object Set oXL = GetObject(, "Excel.Application")
Aby użyć wczesnego wiązania, musisz najpierw ustawić w projekcie odniesienie do aplikacji, którą chcesz manipulować. W edytorze VB dowolnej aplikacji pakietu Office lub w samym VB można to zrobić, wybierając Narzędzia + Referencje i wybierając żądaną aplikację z listy (np. „Biblioteka obiektów programu Microsoft Excel 8.0”).
Aby utworzyć nowe wystąpienie programu Excel przy użyciu wczesnego wiązania:
Dim oXL As Excel.Application Set oXL = New Excel.Application
W obu przypadkach, nawiasem mówiąc, możesz najpierw spróbować pobrać istniejące wystąpienie programu Excel, a jeśli to zwróci błąd, możesz utworzyć nowe wystąpienie w programie obsługi błędów.
Podobna, ale bardziej szczegółowa odpowiedź z książki Herberta Schildta C ++: -
Wczesne wiązanie odnosi się do zdarzeń, które występują w czasie kompilacji. Zasadniczo wczesne wiązanie występuje, gdy wszystkie informacje potrzebne do wywołania funkcji są znane w czasie kompilacji. (Inaczej mówiąc, wczesne wiązanie oznacza, że obiekt i wywołanie funkcji są wiązane podczas kompilacji). Przykłady wczesnego wiązania obejmują normalne wywołania funkcji (w tym standardowe funkcje biblioteczne), przeciążone wywołania funkcji i przeciążone operatory. Główną zaletą wczesnego wiązania jest wydajność. Ponieważ wszystkie informacje niezbędne do wywołania funkcji są określane w czasie kompilacji, tego typu wywołania funkcji są bardzo szybkie.
Przeciwieństwem wczesnego wiązania jest późne wiązanie. Późne wiązanie odnosi się do wywołań funkcji, które nie są rozwiązywane do czasu wykonania. Funkcje wirtualne służą do późnego wiązania. Jak wiesz, gdy dostęp odbywa się przez wskaźnik bazowy lub referencję, faktycznie wywoływana funkcja wirtualna jest określana przez typ obiektu wskazywanego przez wskaźnik. Ponieważ w większości przypadków nie można tego określić w czasie kompilacji, obiekt i funkcja są połączone dopiero w czasie wykonywania. Główną zaletą późnego wiązania jest elastyczność. W przeciwieństwie do wczesnego wiązania, późne wiązanie umożliwia tworzenie programów, które mogą reagować na zdarzenia występujące podczas wykonywania programu bez konieczności tworzenia dużej ilości „kodu awaryjnego”. Należy pamiętać, że ponieważ wywołanie funkcji nie jest rozwiązywane do czasu wykonania, późne wiązanie może spowodować nieco wolniejsze czasy wykonywania. Jednak dzisiaj
W językach tłumaczonych różnica jest nieco bardziej subtelna.
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)
Ponieważ Ruby nie jest (generalnie) skompilowany, nie ma kompilatora, który mógłby zrobić z góry fajne rzeczy. Rozwój JRuby oznacza, że obecnie kompilowanych jest więcej Rubiego, dzięki czemu działa on bardziej jak Java, powyżej.
Problem z IDE nadal istnieje: platforma taka jak Eclipse może wyszukiwać definicje klas, jeśli je na stałe zakodujesz, ale nie może, jeśli pozostawisz je wywołującemu.
Odwrócenie kontroli nie jest zbyt popularne w Rubim, prawdopodobnie z powodu jego ekstremalnej elastyczności w czasie wykonywania, ale Railsy świetnie wykorzystują późne wiązanie, aby zmniejszyć ilość konfiguracji niezbędnej do uruchomienia aplikacji.
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();
}
To zostanie wydrukowane
adult1
child1
We wczesnym wiązaniu kompilator będzie miał dostęp do wszystkich metod w podrzędnym i nastolatku, ale w późnym wiązaniu (w czasie wykonywania) będzie sprawdzać metody, które są przesłonięte w czasie wykonywania.
W związku z tym metoda method1 (from child - early binding) zostanie zastąpiona przez method1 from adult at runtime (late binding) Następnie zaimplementuje metodę method1 od child, ponieważ nie ma metody method1 w method1 u nastolatka.
Zauważ, że jeśli dziecko nie ma metody method1, kod w main nie zostałby skompilowany.
Polimorfizm czasu kompilacji nazywany również przeciążeniem lub wczesnym wiązaniem lub wiązaniem statycznym, gdy mamy tę samą nazwę metody z różnymi zachowaniami. Dzięki wdrożeniu wielu prototypów tej samej metody i innego zachowania następuje w niej. Wczesne wiązanie odnosi się do pierwszej kompilacji programu. Ale w późnym powiązaniu obiekt jest runtime w programie. Nazywany także dynamicznym wiązaniem lub zastępowaniem lub polimorfizmem w czasie wykonywania.