Позднее связывание в VB

Из того, что я прочитал до сих пор, позднее связывание определяет переменную как объект, а затем назначает ее фактическому объекту позже, что фактически выполняется во время выполнения. Я не понимаю смысла в этом. Может быть, это Java во мне, но разве это не ограничивает функциональность тем, что есть только в Object? Это все равно, что сказать: «Мне нужен потенциал дополнительных вещей, но я не хочу иметь к ним доступ». Есть ли реальная цель позднего связывания в VB или Java, если на то пошло, которую я упускаю из виду?


person Tom K    schedule 07.07.2015    source источник
comment
плагины (stackoverflow.com/questions /13487016/)   -  person Fruitbat    schedule 08.07.2015
comment
Вам нужен Option Strict Off для позднего связывания, а затем вы можете вызывать методы, которые не определены в Object, что может привести к сбою во время выполнения, если фактический экземпляр их не реализует.   -  person Mark    schedule 08.07.2015


Ответы (2)


У тебя наоборот. Используя раннее связывание, вы ограничиваете себя только членами типа переменной. С Option Strict On переменная, объявленная как тип Object, позволит вам получить доступ только к членам типа Object, независимо от типа фактического объекта, на который она ссылается. С помощью Option Strict Off вы можете получить доступ к члену с любым именем в переменной типа Object, и компилятор не будет жаловаться. Любая проверка типов выполняется только во время выполнения, поэтому, пока фактический объект, назначенный переменной, имеет член с таким именем, код будет выполняться.

Вероятно, наиболее распространенное использование позднего связывания — это автоматизация офиса. Сейчас есть и другие варианты, но в прошлом, если вы ссылались на библиотеку Office и использовали содержащиеся в ней определенные типы, облегчая раннее связывание, вы были ограничены этой конкретной версией Office. Чтобы поддерживать несколько версий, вам пришлось отказаться от ссылки, объявить все ваши переменные как тип Object и использовать позднее связывание. Пока версия Office, представленная во время выполнения, включала указанные элементы в используемые объекты, код выполнялся без проблем.

Кстати, поздняя привязка не требует использования типа Object, хотя он, наверное, самый распространенный. Это просто означает, что ссылка является менее производным типом, чем объект, и вы используете член типа объекта, которого нет у типа ссылки, например. вы используете тип Control, а затем используете член, специфичный для типа Button.

person jmcilhinney    schedule 08.07.2015

То, что я видел - некоторые ранние разработчики адаптеров .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. Кроме этого, это вредно.

person T.S.    schedule 08.07.2015