编译时绑定还是运行时绑定

gooore 2010-08-06 04:49:57

dim a as object
set a=new class1


大家说,这样实例化是编译时绑定,还是运行时绑定?严格说,这个不能叫后期绑定吧?

Tiger_Zhao回复过我说,这个属于后期绑定。现在我感觉这个应该还是编译时绑定,而不是运行时绑定。
http://topic.csdn.net/u/20090504/09/833abb87-ec27-4d01-9277-b8a77e219c8a.html

谢谢您
...全文
201 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
gooore 2010-08-12
  • 打赏
  • 举报
回复

懂了,谢谢。

[Quote=引用 13 楼 tiger_zhao 的回复:]
越说越昏了。
创建对象和成员调用是两码事,后者才与前期绑定/后期绑定有关。

只要是用 New Excel.Application 方式创建对象,编译时已经确定了某个 GUID。
运行时是否兼容关键看当前注册的 dll 对该 GUID 是否兼容。
兼容问题这和前期绑定/后期绑定没有关系。
[/Quote]
Tiger_Zhao 2010-08-12
  • 打赏
  • 举报
回复
越说越昏了。
创建对象和成员调用是两码事,后者才与前期绑定/后期绑定有关。

只要是用 New Excel.Application 方式创建对象,编译时已经确定了某个 GUID。
运行时是否兼容关键看当前注册的 dll 对该 GUID 是否兼容。
兼容问题这和前期绑定/后期绑定没有关系。
嗷嗷叫的老马 2010-08-11
  • 打赏
  • 举报
回复
学习......
Tiger_Zhao 2010-08-11
  • 打赏
  • 举报
回复
是 New 创建的对象需要引用,而不是成员调用时需要引用。
注意编译错误的位置。
lyserver 2010-08-11
  • 打赏
  • 举报
回复
我的理解是:VB中的object数据类型实际就是COM中的idispatch接口,该接口叫自动化接口,使用idispatch接口来调用基于idispatch接口派生出来的用户接口的某个方法或属性时,将统一由idispatch接口的invoke方法负责,这种方式就叫做后期绑定或后期关联;而直接使用用户接口如IXXX来调用用户接口IXXX的某个方法或属性时,就叫早期绑定或早期关联。
比如:
dim o as excel.application
set o=new excel.application
这是早期绑定,即编译时绑定,这是标准的早期绑定。
同时
dim o as excel.application
set o=createobject("excel.application")
这也是早期绑定。


dim o as object
set o=new excel.application
这是后期绑定,即运行时绑定。
同时
dim o as object
set o=createobject("excel.application")
这是最标准的后期绑定。
gooore 2010-08-11
  • 打赏
  • 举报
回复
谢谢您。

是不是说在运行时还是通过派发借口来完成对象的实例化?编译时需要检查类型库,但是并没有绑定对象类型。

那这样会不会出现版本不兼容呢?

[Quote=引用 9 楼 tiger_zhao 的回复:]
是 New 创建的对象需要引用,而不是成员调用时需要引用。
注意编译错误的位置。
[/Quote]
bcrun 2010-08-11
  • 打赏
  • 举报
回复
因为你是显式声明的,它要在编译时做把a绑定到Excel.Application的类型检查

PctGL 2010-08-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gooore 的回复:]

谢谢您

可是下面的代码为什么一定引用才能编译呢?难道只是需要找到类型库才能编译,并不会出现兼容性问题吗?

VB code

Dim a As Object
Set a = New Excel.Application
[/Quote]

如果没有引用 Excel 此时的 Excel.Application 是完全未知的内容,ide根本不知道他是什么
如果引用了 execel 则,ide加载excel的类型库时会得到有关 Excel.Application 的信息,明确知道他是什么
这样才能引用

照这样写的话应该是
set a=createobject("excel.application")
前提是 excel.application 确实是一个有意义的类型库的名字

所谓类型库就是保存着com对象信息的一个内容,通常atx dll,ocx 要注册,就是注册类型库
注册了类型库,你才可以直接通过 createobject 或者 引用的方式调用

gooore 2010-08-10
  • 打赏
  • 举报
回复
谢谢您

可是下面的代码为什么一定引用才能编译呢?难道只是需要找到类型库才能编译,并不会出现兼容性问题吗?


Dim a As Object
Set a = New Excel.Application
Tiger_Zhao 2010-08-09
  • 打赏
  • 举报
回复
判定前期还是后期不关键不在于你如何创建创建对象,而是调用的成员是否明确。
Dim a As Object
Set a = '无论 New 还是 CreateObject 都没关系'
a.Walk '关键是 Walk 是不是 a 的成员不知道。'
'如果是,到底是 a 的哪个接口的成员也不知道。'
'一切都需要到运行时(后期)才能决定。'
韧恒 2010-08-08
  • 打赏
  • 举报
回复
的确属于"后期绑定"!
PctGL 2010-08-06
  • 打赏
  • 举报
回复
是晚期绑定,其实就是ide犯懒了,如果ide能够勤快一点的跟踪下实例化时的对象类型库,就能解析出来

但我想这可能是vb有意保留的晚期绑定的功能。
yangxie5201314 2010-08-06
  • 打赏
  • 举报
回复
老鸟说的呢还不信啊
bcrun 2010-08-06
  • 打赏
  • 举报
回复
MS说这是后绑定,因为他就是这样实现的

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧