首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

关于对象后期绑定的Type Mismatch有关问题

2012-03-23 
关于对象后期绑定的Type Mismatch问题延续这个帖子53楼的讨论。可以用UserControl类型的变量去引用control

关于对象后期绑定的Type Mismatch问题
延续这个帖子53楼的讨论。

可以用UserControl类型的变量去引用control类型的变量,反之却不行。为什么?

VB code
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


赵老虎的简单解释是:因为不是按照通常意义的“继承”实现的,MyControl 是单一接口,Control 是“混合”接口。因为那会儿我不是很理解接口的概念,所以就只好勉强接受了这种解释。


[解决办法]
这里至少有三个类:
1)Control
2)MyControl[Class]
3)MyControl[UserControl]
 “继承” Control
 包含 MyControl[Class] 实例,只是通过某种“代理”使得看起来好像同时“继承”了 MyControl[Class] 。

前面提到了,在工程内,myCtl 声明的类型其实是 MyControl[Class]。
所以将步骤分开来
VB code
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 不是同一个对象
VB code
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
[解决办法]
探讨
阿勇,请问3楼的代码是不是伪代码啊?还有MyControl[UserControl]、MyControl[Class]
这种用法的?

[解决办法]
如果要用24楼的图来理解,MyControl[Class] 应该是右边的第三个组成部分,类似于下面的组成:
MyControl[UserControl] {
Control,
Extender Object,
MyControl[Class]
}

如果用对象指针的方式来分析3楼的前半部分代码,那么:ObjPtr(newCtl) = ObjPtr(ctl)
所以以下两个语句等价,都是取 newCtl 中的 MyControl[Class] 实例
VB code
Set myCtl = ctlSet myCtl = newCtl
[解决办法]
MyControl[UserControl] 对 MyControl[Class] 的“继承”其实是自动封装,MyControl[Class] 实例是 MyControl[UserControl] 实例的一个成员,当需要从 MyControl[UserControl] 转换成 MyControl[Class] 时其实是返回了该成员(另一个对象)。
[解决办法]
推测!
就像宇宙膨胀论一样,用说得过去的理由解释看到的现象,纯属推测。
[解决办法]
首先阅读《高级 Visual Basic 编程》关于 VTable 的部分。

一个 MyDll2 实例创建时,在分配内存上有如下数据结构(示意)
VB code
Type MyDll2Memory    pVTable0 '指向 MyDll2 的 VTable 指针'    ...    pVTable1 '指向 ITest1 的 VTable 指针'    ...    pVTable2 '指向 ITest2 的 VTable 指针'    ...End Type
[解决办法]
判断两个对象是否相同用 Is 运算符
VB code
bb Is cc1
------解决方案--------------------


是的。
看图更容易理解。

热点排行