Jaka jest różnica między wczesnym a późnym wiązaniem?
binding
dynamic-binding
static-binding
James A. Rosen
źródło
źródło
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).
źródło
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).
źródło
Pobrano bezpośrednio z http://word.mvps.org/fAQs/InterDev/EarlyvsLateBinding.htm
źródło
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
źródło
W językach tłumaczonych różnica jest nieco bardziej subtelna.
Rubin:
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.
źródło
To zostanie wydrukowane
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.
źródło
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.
źródło