a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 93|回复: 1

[Visual Basic] 2011年计算机等考二级VB辅导知识技巧总结(5)

[复制链接]
发表于 2012-7-31 22:10:12 | 显示全部楼层 |阅读模式
VB6的后期绑定和前期绑定  1. 什么是后期绑定和前期绑定后期绑定' E0 ]- j% u3 u) F% |2 r7 J( W3 Z
  MSDN 6的定义如下:
$ o% D6 a: F3 h( G% h  后期绑定:若将一个变量声明为 As Object 或 As Variant(包括 As Form 或 As Control 的变量),Visual Basic 在编译时就无法确定该变量将引用哪种类型的对象。因此,Visual Basic 必须使用后期绑定,在运行时确定对象的属性和方法能否使用该变量。% Q: M4 t/ c9 R$ F% Q! I+ c
  若使用后期绑定,则每次调用属性或方法时,Visual Basic 都要将成员名传给该对象 IDispatch 接口的 GetIDsOfNames 方法。GetIDsOfNames 返回该成员的派遣 ID,或 DispID。Visual Basic 再将该 DispID 传给 IDispatch 接口的 Invoke 方法来调用该成员。
3 K- o0 K  n" A5 J; K  对进程外部件而言,这意味着一次额外的跨进程方法调用,结果是调用开销翻番。
+ L& z8 `: S# l# J# s" e$ o$ k% Q  前期绑定:如果在编译时 Visual Basic 能够知道属性或方法所属的对象,就可以预先查找该成员在类型库中的 DispID 或 vtable 地址。这样就无须在运行时调用 GetIDsOfNames。
1 S7 Z, y1 }7 f  当显式声明了变量的类时,例如 As Widget,该变量就只能存放该类的对象的引用。Visual Basic 就可以为该变量调用的所有属性和方法使用前期绑定。
# P7 z$ i8 y+ z& x' ~: u' h; i  建议在 Visual Basic 和应用程序中使用这种方法来声明对象变量。
8 r# I" \; x9 {  使用前期绑定还是后期绑定完全取决于声明变量的方式。对象的创建方式对此没有任何影响。
2 w6 T) X5 t& s3 T  2. 后期绑定的几个优势和好处
# C% r/ _+ J, U" s4 i  第一,个人认为,由于VB6不支持实现继承,对于某些设计,可以使用将对象定义为Variant变量,而获取某些设计和编码上的便利,而得到接口或抽象类的好处。例如:* X3 D; \: \/ ?( E- M  {& `
  如定义2个类:8 c& _% Q; Q+ E; L
  Class1:' R/ E+ ^8 {$ D  k
  1Option Explicit
) n/ N5 e/ {/ q& {  2  s; H3 m. g; R2 ?0 f. [4 R8 N
  3Public Sub Update()
" ~6 s) y: E- Q& E0 H2 i" {8 F2 z  4 MsgBox "Class1 Updated"
( U2 A( c' s1 `$ `+ t0 c  5End Sub& G" j& E+ s& X6 Z
  Class2:
" x% ~$ N) A4 F7 V) V# _  1Option Explicit
回复

使用道具 举报

 楼主| 发表于 2012-7-31 22:10:13 | 显示全部楼层

2011年计算机等考二级VB辅导知识技巧总结(5)

 2  3Public Sub Update()
! a) R) i& A8 T0 [  4 MsgBox "Class2 Updated"
, p4 U3 ]7 W% v0 J  5End Sub, x* o) O: v5 E* w; k' ]! _
  在使用的时候,可以使用以下方法,而实现一些设计模式:0 \2 v$ d1 }& H! @+ |5 N7 y0 I* P" i$ c
  1Dim objTest As Variant
5 v  }, |0 Z9 i' m5 Z  27 |" C' D# N! x4 S
  3Dim objC1 As New Class1
6 Q4 [, q" Q5 M' w  4Set objTest = objC1
4 ?8 f' q' y/ z: n. J+ I3 _  5objTest.Update' A# `# r( F, v! s: ^$ a
  6
* H$ e# }# {9 t4 B" Z2 l. ]  7Dim objC2 As New Class20 K; a, k/ ]$ W3 [8 J) z  r; r
  8Set objTest = objC2
% G, {$ K6 W. K6 B" ^- S7 a  9objC2.Test' j$ A; w4 E3 \1 b! T! s
  10- Q! F* H5 W2 P6 M& k
  这样,无须继承机制,也可以得到抽象接口的优势,而使接口、实现分离。
6 ^, I2 w8 z. J! t  第二,在调用外部的COM自动化组件时,如Office,如果通过这种方式调用,对于不同版本的Office,如果你调用的方法、属性都是存在的,那么可以适应不同版本的Office,但如果通过前期绑定,在项目引用中确定对象类型,是有版本兼容问题的。
/ R, t* w; ]  B/ Z# `* R  3. 效率和劣势' F9 K) m* m& V0 K* o9 Y3 @
  其实最主要的劣势是效率问题,《Advanced Visual Basic 6》一书说,使用Variant变量和Long变量进行循环,效率差别是1.5倍,而没有别人认为的那么大,而且对于大对象,差别也不是很大。对于本文前边的例子,如果创建的是进程内对象,前期绑定和后期绑定调用效率差别大概2:3左右,也就是说也是1.5倍。对于调用Office这样的外部COM自动化对象,也许差别大一些,没有专门测试,不过对于Office自动化,速度主要是决定于Office本身的启动、初始化。
# R; B3 F2 v" D1 G5 T; L6 x  另外一个劣势是没有了IDE下的属性、方法成员自动列出。  v' Z- Z" o* \9 s
  所以,个人认为,在使用VB6的时候,为了得到好的设计,有时不妨使用一些VB6的后期绑定的特性,来提高设计质量。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 09:43 , Processed in 0.199861 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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