a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 101|回复: 0

[Visual Basic] 关于VB6的后期绑定和前期绑定

[复制链接]
发表于 2012-7-31 22:10:12 | 显示全部楼层 |阅读模式
1. 什么是后期绑定和前期绑定后期绑定   MSDN 6的定义如下:5 S" v3 S. N, |
  后期绑定:若将一个变量声明为 As Object 或 As Variant(包括 As Form 或 As Control 的变量),Visual Basic 在编译时就无法确定该变量将引用哪种类型的对象。因此,Visual Basic 必须使用后期绑定,在运行时确定对象的属性和方法能否使用该变量。# [9 j2 |8 j) H
  若使用后期绑定,则每次调用属性或方法时,Visual Basic 都要将成员名传给该对象 IDispatch 接口的 GetIDsOfNames 方法。GetIDsOfNames 返回该成员的派遣 ID,或 DispID。Visual Basic 再将该 DispID 传给 IDispatch 接口的 Invoke 方法来调用该成员。
2 T4 [  o  Y; N) a$ S& h  对进程外部件而言,这意味着一次额外的跨进程方法调用,结果是调用开销翻番。
6 _* R6 u4 n7 n$ l  前期绑定:如果在编译时 Visual Basic 能够知道属性或方法所属的对象,就可以预先查找该成员在类型库中的 DispID 或 vtable 地址。这样就无须在运行时调用 GetIDsOfNames。
* z' R2 O0 L# A& ?1 b! R  当显式声明了变量的类时,例如 As Widget,该变量就只能存放该类的对象的引用。Visual Basic 就可以为该变量调用的所有属性和方法使用前期绑定。
& n. g7 t. F0 @2 K) s& J  建议在 Visual Basic 和应用程序中使用这种方法来声明对象变量。
) p! H& K) }( L" m. J$ T  使用前期绑定还是后期绑定完全取决于声明变量的方式。对象的创建方式对此没有任何影响。" H4 I; Q5 A4 m! n
  2. 后期绑定的几个优势和好处
4 u. u1 F2 _* m9 y7 ^2 y' q2 b  第一,个人认为,由于VB6不支持实现继承,对于某些设计,可以使用将对象定义为Variant变量,而获取某些设计和编码上的便利,而得到接口或抽象类的好处。例如:
& N2 M( p: `; Z1 h  如定义2个类:! \6 z5 _8 |$ X2 c
  Class1:
( x  t; Q/ |" {- l7 n  1Option Explicit2 \0 u" W$ F2 w/ H& A
  2
# c  u6 v3 F4 d* ?9 `! ^1 y4 o  3Public Sub Update()
/ X1 H4 K( r; U# C  4 MsgBox "Class1 Updated"
- u3 |& e$ k( I  5End Sub
% ]4 ^3 t' W& d$ q  Class2:, o6 O+ \3 r8 N( t! A* b2 Y
  1Option Explicit& K( k( g' @8 S3 u4 z7 P* f
  2
" B8 l5 @! a1 Z7 a3 Z8 ~  3Public Sub Update()  T  l9 n) ^3 P5 L" @
  4 MsgBox "Class2 Updated": W* O1 a# k4 Z
  5End Sub
. n! p/ d; Z8 Y: s/ Y/ m: I+ c  在使用的时候,可以使用以下方法,而实现一些设计模式:
+ Z( w" o. X4 p/ m/ u/ p( O) B  1Dim objTest As Variant0 M8 E/ q9 ?: S, K5 g. f
  2
6 p, V/ |5 }3 [4 B, E* c0 S  3Dim objC1 As New Class16 h* H$ _7 w( p, }8 o# }$ r
  4Set objTest = objC1( |- T9 L& E2 [
  5objTest.Update
( f# `. V1 x/ ]& m7 z4 E  6% A4 y9 z/ q0 Y' R0 s
  7Dim objC2 As New Class2
% i- k7 G1 o' h/ F  8Set objTest = objC2
- g3 D9 ]  @# C! o2 M3 g  9objC2.Test
! W; J1 D9 c& K0 B$ F  10# O9 b  ^2 M6 B  `
  这样,无须继承机制,也可以得到抽象接口的优势,而使接口、实现分离。/ H9 e7 I* R' \+ x0 x9 b
  第二,在调用外部的COM自动化组件时,如Office,如果通过这种方式调用,对于不同版本的Office,如果你调用的方法、属性都是存在的,那么可以适应不同版本的Office,但如果通过前期绑定,在项目引用中确定对象类型,是有版本兼容问题的。" q4 A# [; E/ p* I
  3. 效率和劣势" _9 M$ M2 r! n# _
  其实最主要的劣势是效率问题,《Advanced Visual Basic 6》一书说,使用Variant变量和Long变量进行循环,效率差别是1.5倍,而没有别人认为的那么大,而且对于大对象,差别也不是很大。对于本文前边的例子,如果创建的是进程内对象,前期绑定和后期绑定调用效率差别大概2:3左右,也就是说也是1.5倍。对于调用Office这样的外部COM自动化对象,也许差别大一些,没有专门测试,不过对于Office自动化,速度主要是决定于Office本身的启动、初始化。5 G0 e6 \  ~8 H  i: j* a- y
  另外一个劣势是没有了IDE下的属性、方法成员自动列出。  A, }  p0 S6 X) w) S: B
  所以,个人认为,在使用VB6的时候,为了得到好的设计,有时不妨使用一些VB6的后期绑定的特性,来提高设计质量。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-4 04:44 , Processed in 0.267020 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表