关于对象后期绑定的Type Mismatch问题
延续这个帖子53楼的讨论。
可以用UserControl类型的变量去引用control类型的变量,反之却不行。为什么?
Option ExplicitPrivate Sub Form_Load() Dim myCtl As MyControl Dim ctl As Control '*****这个可以 Set ctl = Me.Controls.Add("Project1.MyControl", "ctl") Set myCtl = ctl'*****这个不可以 Set myCtl = Me.Controls.Add("Project1.MyControl", "ct2") Set ctl = myCtl '这一句运行时错误:Type mismatch.End Sub
Option ExplicitPrivate Sub Form_Load() Dim newCtl As MyControl[UserControl] Dim myCtl As MyControl[Class] Dim ctl As Control '*****这个可以' Set newCtl = Me.Controls.Add("Project1.MyControl", "ctl") Set ctl = newCtl Set myCtl = ctl '其实是取 newCtl 中的 MyControl[Class] 实例''*****这个不可以' Set newCtl = Me.Controls.Add("Project1.MyControl", "ctl") Set myCtl = newCtl '其实是取 newCtl 中的 MyControl[Class] 实例' Set ctl = myCtl 'MyControl[Class] 不包含、不“继承”MyControl[UserControl],所以' '这一句运行时错误:Type mismatch.'End Sub
[解决办法]
是不是纯粹的 Implements 没有任何文档说明。
只能从逻辑上给予推测,具体实现细节是 VB 秘密,不知道。
[解决办法]
不对,只要是同一个对象,通常可以在实现的接口之间自由转化。
其实用下面的方法,很容易知道 myCtl 和 ctl 不是同一个对象
Private Sub Form_Load() Dim myCtl As MyControl Dim ctl As Control Set ctl = Me.Controls.Add("Project1.MyControl", "ctl") Set myCtl = ctl Debug.Print Hex(ObjPtr(ctl)) Debug.Print Hex(ObjPtr(myCtl))End Sub
[解决办法]
Set myCtl = ctlSet myCtl = newCtl
[解决办法]
MyControl[UserControl] 对 MyControl[Class] 的“继承”其实是自动封装,MyControl[Class] 实例是 MyControl[UserControl] 实例的一个成员,当需要从 MyControl[UserControl] 转换成 MyControl[Class] 时其实是返回了该成员(另一个对象)。
[解决办法]
推测!
就像宇宙膨胀论一样,用说得过去的理由解释看到的现象,纯属推测。
[解决办法]
首先阅读《高级 Visual Basic 编程》关于 VTable 的部分。
一个 MyDll2 实例创建时,在分配内存上有如下数据结构(示意)
Type MyDll2Memory pVTable0 '指向 MyDll2 的 VTable 指针' ... pVTable1 '指向 ITest1 的 VTable 指针' ... pVTable2 '指向 ITest2 的 VTable 指针' ...End Type
[解决办法]
判断两个对象是否相同用 Is 运算符
bb Is cc1
------解决方案--------------------
是的。
看图更容易理解。