Из того, что я прочитал до сих пор, позднее связывание определяет переменную как объект, а затем назначает ее фактическому объекту позже, что фактически выполняется во время выполнения. Я не понимаю смысла в этом. Может быть, это Java во мне, но разве это не ограничивает функциональность тем, что есть только в Object? Это все равно, что сказать: «Мне нужен потенциал дополнительных вещей, но я не хочу иметь к ним доступ». Есть ли реальная цель позднего связывания в VB или Java, если на то пошло, которую я упускаю из виду?
Позднее связывание в VB
Ответы (2)
У тебя наоборот. Используя раннее связывание, вы ограничиваете себя только членами типа переменной. С Option Strict On
переменная, объявленная как тип Object
, позволит вам получить доступ только к членам типа Object
, независимо от типа фактического объекта, на который она ссылается. С помощью Option Strict Off
вы можете получить доступ к члену с любым именем в переменной типа Object
, и компилятор не будет жаловаться. Любая проверка типов выполняется только во время выполнения, поэтому, пока фактический объект, назначенный переменной, имеет член с таким именем, код будет выполняться.
Вероятно, наиболее распространенное использование позднего связывания — это автоматизация офиса. Сейчас есть и другие варианты, но в прошлом, если вы ссылались на библиотеку Office и использовали содержащиеся в ней определенные типы, облегчая раннее связывание, вы были ограничены этой конкретной версией Office. Чтобы поддерживать несколько версий, вам пришлось отказаться от ссылки, объявить все ваши переменные как тип Object
и использовать позднее связывание. Пока версия Office, представленная во время выполнения, включала указанные элементы в используемые объекты, код выполнялся без проблем.
Кстати, поздняя привязка не требует использования типа Object
, хотя он, наверное, самый распространенный. Это просто означает, что ссылка является менее производным типом, чем объект, и вы используете член типа объекта, которого нет у типа ссылки, например. вы используете тип Control
, а затем используете член, специфичный для типа Button
.
То, что я видел - некоторые ранние разработчики адаптеров .NET делали то, что они использовали позднее связывание вместо интерфейсов. Они объявят два или более типов
Public Class Handler1
Public Sub Execute()
' do something
End Sub
End Class
Public Class Handler2
Public Sub Execute()
' do something else
End Sub
End Class
И воткнули бы эту штуку в session
объект
If someting = 1 Then
Session("Handler") = New Handler1()
Else
Session("Handler") = New Handler2()
End If
А затем, чтобы обработать то, что они будут делать
Session("Handler").Execute()
Ну вот. Это не красиво и не умно. Но это было вместо правильного программирования, подобного этому (представьте, что обработчики реализуют интерфейс IHandler
с методом Execute
)
Dim h As IHandler = TryCast(Session("Handler"), IHandler)
If h IsNot Nothing Then
h.Execute()
End If
Вот где начинается падение позднего связывания: В случае позднего связывания кто-то где-то может переименовать метод Execute и красиво скомпилировать код. Выпускать. И только потом, во время выполнения, получить проблему.
Позднее связывание было хорошо, когда мы имели дело с interop
и COM
. Кроме этого, это вредно.
Option Strict Off
для позднего связывания, а затем вы можете вызывать методы, которые не определены вObject
, что может привести к сбою во время выполнения, если фактический экземпляр их не реализует. - person Mark   schedule 08.07.2015