VB中的后期绑定

时间:2015-07-07 21:06:12

标签: vb.net late-binding

从我到目前为止所读到的,后期绑定将变量定义为Object,然后将其分配给实际的对象,这实际上是在运行时完成的。我不明白这一点。也许这就是我的Java,但是这不会将功能限制在Object中吗?这就好说,“我想要额外的东西的潜力,但我不想访问它。”对于VB中的后期绑定是否存在实际目的,或者Java,我忽略了什么?

2 个答案:

答案 0 :(得分:2)

你倒退了。通过使用早期绑定,您只能将自己局限于变量类型的成员。对于Option Strict On,声明为类型Object的变量只允许您访问类型Object的成员,而不管它引用的实际对象的类型。使用Option Strict Off,您可以访问类型为Object的变量上的任何名称的成员,编译器不会抱怨。只有在运行时才进行任何类型检查,只要分配给变量的实际对象具有该名称的成员,代码就会运行。

后期绑定最常见的用途可能是Office Automation。现在还有其他选项,但在过去,如果您引用了一个Office库并使用了它包含的特定类型,从而促进了早期绑定,那么您只能使用该特定版本的Office。为了支持多个版本,您必须放弃引用,将所有变量声明为类型Object并使用后期绑定。只要运行时出现的Office版本包含所使用对象的指定成员,代码就会毫无问题地运行。

顺便说一下,后期绑定并不需要使用类型Object,尽管它可能是最常见的。它只是意味着引用是比对象更少派生的类型,并且您使用引用类型没有的对象类型的成员,例如,您使用类型Control,然后使用特定成员来键入Button

答案 1 :(得分:1)

我看到的 - 一些早期的.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

这是后期绑定开始失败的地方:在后期绑定的情况下,有人在某处可以重命名方法执行并很好地编译代码。发布。只有这样,在运行时才会遇到问题。

我们以前处理interopCOM时,后期绑定效果很好。除此之外,这是有害的。