В чем разница между ранним и поздним переплетом?
Короткий ответ - то, что рано (или статичный) закрепление относится ко времени компиляции, связывая и поздно (или динамичный), закрепление относится к закреплению времени выполнения (например, когда Вы используете отражение).
В компилируемых языках разница разительна.
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);
В первом примере компилятор может делать всевозможные аккуратные вещи во время компиляции. Во втором случае вам остается только надеяться, что тот, кто использует этот метод, делает это ответственно. (Конечно, новые JVM поддерживают структуру Class<? extends Foo> klass
, которая может значительно снизить этот риск).
Еще одним преимуществом является то, что IDE может сделать горячую ссылку на определение класса, поскольку он объявлен прямо в методе. Вызов create_something(Foo) может быть очень далеко от определения метода, и если вы смотрите на определение метода, было бы неплохо увидеть его реализацию.
Главное преимущество позднего связывания в том, что оно облегчает такие вещи, как инверсия управления, а также некоторые другие виды использования полиморфизма и утиной типизации (если ваш язык поддерживает такие вещи).
Взято непосредственно с сайта http://word.mvps.org/fAQs/InterDev/EarlyvsLateBinding.htm
Существует два способа использования автоматизации (или OLE Automation) для того. программно управлять другим приложением.
Позднее связывание использует CreateObject для создания экземпляра объекта приложения. объекта приложения, которым вы можете затем управлять. Например, чтобы создать новый экземпляр Excel с помощью позднего связывания:
Dim oXL As Object Set oXL = CreateObject("Excel.Application")
С другой стороны, для манипулирования существующим экземпляром Excel (если Excel уже открыт) вы будете использовать GetObject (независимо от того. вы используете раннее или позднее связывание):
Dim oXL As Object Set oXL = GetObject(, "Excel.Application")
Чтобы использовать раннее связывание, вам сначала нужно установить ссылку в вашем проекте на приложение, которым вы хотите манипулировать. В редакторе VB из любого приложения Office или в самом VB, вы делаете это, выбирая Инструменты + Ссылки, и выберите нужное приложение из списка (например, "Microsoft Excel 8.0 Object Library").
Чтобы создать новый экземпляр Excel с помощью раннего связывания:
Dim oXL As Excel.Application Set oXL = New Excel.Application
В любом случае, кстати, можно сначала попытаться получить существующий экземпляр Excel, и если это вернет ошибку, вы можете создать новый экземпляр в обработчике ошибок.
Подобный но более подробный ответ от Герберта Шилдта К ++ заказывает:-
Раннее закрепление обращается к событиям, которые происходят во время компиляции. В сущности раннее закрепление происходит, когда вся информация должна была вызвать функцию, известен во время компиляции. (Помещенный по-другому, рано связывая средства, что объект и вызов функции связаны во время компиляции.) Примеры раннего закрепления включают нормальные вызовы функции (включая стандартные функции библиотеки), перегруженные вызовы функции и перегруженных операторов. Главное преимущество для раннего закрепления - эффективность. Поскольку вся информация, необходимая, чтобы вызвать функцию, определена во время компиляции, эти типы вызовов функции очень быстры.
Противоположность раннего закрепления поздно связывает. Последнее закрепление относится к вызовам функции, которые не решены до времени, которым управляют. Виртуальные функции используются, чтобы достигнуть поздно закрепления. Как Вы знаете, когда доступ через указатель базы или ссылку, виртуальная функция, на самом деле вызванная, определена типом объекта, на который указывает указатель. Поскольку в большинстве случаев это не может быть определено во время компиляции, объект и функция не связаны до времени, которым управляют. Главное преимущество для последнего закрепления - гибкость. В отличие от раннего закрепления, последнее закрепление позволяет Вам создавать программы, которые могут ответить на появление событий, в то время как программа подписывает, не имея необходимость создавать a большая сумма " кодекс " непредвиденного обстоятельства; Следует иметь в виду, что, потому что вызов функции не решен до времени, которым управляют, последнее закрепление может сделать в течение несколько более медленных времен выполнения. Однако сегодня быстрые компьютеры значительно уменьшили времена выполнения, связанные с последним закреплением.
В интерпретируемых языках разница немного более тонкая.
Ruby:
# 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)
Поскольку Ruby (как правило) не компилируется, нет компилятора, который бы выполнял все необходимые действия. Развитие JRuby означает, что в наши дни все больше Ruby компилируется, что делает его более похожим на Java.
Проблема с IDE по-прежнему актуальна: такая платформа, как Eclipse, может искать определения классов, если вы их жестко закодировали, но не может, если вы оставили их на усмотрение вызывающей стороны.
Инверсия контроля не слишком популярна в Ruby, вероятно, из-за его чрезвычайной гибкости во время выполнения, но Rails отлично использует позднюю привязку, чтобы уменьшить количество конфигураций, необходимых для запуска приложения.
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();
}
Это распечатает
adult1
child1
В раннем закреплении компилятора будет иметь доступ ко всем методам в ребенке и подростке но в последнем закреплении (во времени выполнения), это проверит на методы, которые отвергнуты во времени выполнения.
Следовательно method1 (от ребенка - рано связывающий) будет отвергнут method1 от взрослого во времени выполнения (поздно связывающий) Тогда это осуществит method1 от ребенка, так как есть № method1 в method1 в подростке.
Обратите внимание, что, если бы у ребенка не было method1 тогда, кодекс в основном не собрал бы.
Полиморфизм времени компиляции также звонил как перегрузка или рано закрепление или статическое закрепление, когда у нас есть то же название метода с различными поведениями. Осуществляя несколько моделируют того же метода, и различное поведение происходит в нем. Раннее закрепление отсылает первую компиляцию программы. Но в последнем обязательном объекте время выполнения, происходит в программе. Также названный как Динамическое закрепление или отвержение или полиморфизм Во время выполнения.