从我到目前为止所读到的,后期绑定将变量定义为Object,然后将其分配给实际的对象,这实际上是在运行时完成的。我不明白这一点。也许这就是我的Java,但是这不会将功能限制在Object中吗?这就好说,“我想要额外的东西的潜力,但我不想访问它。”对于VB中的后期绑定是否存在实际目的,或者Java,我忽略了什么?
答案 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
这是后期绑定开始失败的地方:在后期绑定的情况下,有人在某处可以重命名方法执行并很好地编译代码。发布。只有这样,在运行时才会遇到问题。
我们以前处理interop
和COM
时,后期绑定效果很好。除此之外,这是有害的。