在VB6下如何实现继承,重载和多态----DynamicClassFactory
来源:互联网 发布:什么是互联网金融知乎 编辑:程序博客网 时间:2024/05/16 23:57
在VB6下如何实现继承,重载和多态----DynamicClassFactory (一)[问题点数:100分]
收藏
- 账号:zzz1117
- 昵称:zzz1117
- 关注 博客空间
- 最新帖子:
- 让你的VB动态起来——EnjoyVBLib...
- 让您在 VB6 下实现继承、多态和...
- 在VB6下如何实现继承,重载和多...
- 取消关注
- 关注
- zzz1117
- zzz1117
- 本版等级:本版专家分:30
- 结帖率:25%
楼主 发表于: 2007-08-06 12:43:30
[摘要]
DynamicClassFactory ,一个支持在VB6里实现继承,多态,重载的库,目前,DynamicClassFactory还在开发中,预计月底出测试版,届时提供网友下载使用.本文仅仅介绍对属性继承的实现,下一篇将集中介绍函数的继承\多态\重载,敬请关注.
[正文]
//是不是在为VB6对继承支持得不好而发愁?是不是在为VB6没有重载而发愁?有类似疑惑的话,请继续阅读,DynamicClassFactory 将为您解开这些疑惑.
'//有的时候,在编程时,老感觉某个控件的属性少了点什么,比如 Tag 属性为什么只有一个?其实我们只是在想记录更多的信息
Dim DynamicObj As Object
Set DynamicObj = DynamicClassFactory.NewObj(Me.Text1)
'//从 DynamicClassFactory 中获得一个新类,该类 将继承 Text1 的所有属性
Debug.Print DynamicObj.Text
'//输出其 文本
DynamicObj.Properties.Add "NewTag", [A String], "增加一个 Tag 属性"
Debug.Print DynamicObj.NewTag
'//增加了一个属性 NewTag,并试图访问
有的时候,我疑惑 TextBox 有Text 属性,而 DTpicker 有 Value 属性,同出而异名,异曲而同工,能不能也通过 Value 来访问 TextBox的Text属性呢? DynamicClassFactory 将支持你这么做.
Dim Property As DynamicClassFactory.Property
Set Property = DynamicObj.Properties("Text")
Property.Name = "Value"
Debug.Print DynamicObj.Value
'//这个时候,Value输出的是 Text1 的Text属性值
当然了,当我么访问 DynamicObj.Text 的时候, 其实 DynamicClassFactory 返回的是一个 Property 对象,其有一个默认属性就是 Value
由此,我们实现更改属性称谓的实现也可以通过下面方式来进行
DynamicObj.Text.Name = "Value"
Debug.Print DynamicObj.Value
VB6可以说称不上支持重载,我有的时候疑惑,为什么不能在设置 Textbox 的 Enabled 属性为 False 的同时,其背景色同时换成灰色?即,我是否可以有一个机制,可以让一个类继承了 TextBox 的大多属性的同时
对其 Enabled 属性有一个扩充(重载)?答案是否定的,VB6不提供类似机制.
而我的 DynamicClassFactory 做到了这一点
DynamicObj.Enabled = Flase
'//Text1 将 Disable,同时其背景色为灰
有的时候 , 我们取得一个记录集(ADODB.Recordset), 在取值时候, 要逐个字段判断其值是否为NULL, 很烦恼.如果您有类似的烦恼, 请阅读下去!
Dim Properties As DynamicClassFactory.Properties
Dim SQL As String
Dim Recordset As ADODB.Recordset
SQL = "SELECT Name ,Age ,Sex From StudentsInfo"
Set Recordset = g_Cn.Execute(SQL)
Call DynamicObj.Bind(Recordset)
这个时候 DynamicObj 将绑定到这个记录集,并按照 这个记录集的字段生成相应属性,并支持访问
Set Properties = DynamicObj.Properties
For Each Property In Properties
Debug.Print Property.Name & ":" & Property.Value
Next
'//遍历属性成员
Debug.Print DynamicObj.Name
'//访问属性成员
当然了,如果把 DynamicObj 的 BoundMode 设置成 BoundAutomatic(自动绑定)时,则当 Recordset 的 AbsolutePosition 发生变动时候, DynamicObj 各属性成员是动态刷新的,请看下面的例子
Recordset.MoveFirst
DynamicObj.BoundMode = BoundAutomatic
Do While Not Recordset.EOF
Debug.Print DynamicObj.Name
Recordset.MoveNext
Loop
'//逐条输出学生的姓名
当然了也可以:
Recordset.MoveFirst
DynamicObj.BoundMode = BoundManual '//手动绑定
Do While Not Recordset.EOF
Call DynamicObj.Refresh '//手动刷新
Debug.Print DynamicObj.Name
Recordset.MoveNext
Loop
'//逐条输出学生的姓名
DynamicClassFactory 不仅支持对象创建时的继承\运行中绑定 Recordset,还支持运行中继承,支持对普通类实例或是单层结构的 Type(UserDataType) 进行继承
'//比如我们有如下的一个结构
Public Type LinkManType
Name As String
Company As String '//公司
Telephone As String '//电话
MobilePhone As String '//移动电话
Position As String '//职务
End Type
'//下面演示结构继承
Dim LinkMan As LinkManType
LinkMan.Company = "微软"
LinkMan.MobilePhone = "1361920XXXX"
LinkMan.Name = "周XX"
LinkMan.Position = "经理"
LinkMan.Telephone = "029-8888888"
Call DynamicObj.ExtendFrom(LinkMan)
Debug.Print DynamicObj.Name
'//输出 我的姓名
如果我们有一个类,有上述 LinkManType 的结构,其实例名称为 cLinkMan,我们一样可以调用 ExtendFrom 来实现继承,至于手动对属性成员进行增\删\改,更是不在话下.
下次介绍函数重载及多态.敬请关注.
DynamicClassFactory ,一个支持在VB6里实现继承,多态,重载的库,目前,DynamicClassFactory还在开发中,预计月底出测试版,届时提供网友下载使用.本文仅仅介绍对属性继承的实现,下一篇将集中介绍函数的继承\多态\重载,敬请关注.
[正文]
//是不是在为VB6对继承支持得不好而发愁?是不是在为VB6没有重载而发愁?有类似疑惑的话,请继续阅读,DynamicClassFactory 将为您解开这些疑惑.
'//有的时候,在编程时,老感觉某个控件的属性少了点什么,比如 Tag 属性为什么只有一个?其实我们只是在想记录更多的信息
Dim DynamicObj As Object
Set DynamicObj = DynamicClassFactory.NewObj(Me.Text1)
'//从 DynamicClassFactory 中获得一个新类,该类 将继承 Text1 的所有属性
Debug.Print DynamicObj.Text
'//输出其 文本
DynamicObj.Properties.Add "NewTag", [A String], "增加一个 Tag 属性"
Debug.Print DynamicObj.NewTag
'//增加了一个属性 NewTag,并试图访问
有的时候,我疑惑 TextBox 有Text 属性,而 DTpicker 有 Value 属性,同出而异名,异曲而同工,能不能也通过 Value 来访问 TextBox的Text属性呢? DynamicClassFactory 将支持你这么做.
Dim Property As DynamicClassFactory.Property
Set Property = DynamicObj.Properties("Text")
Property.Name = "Value"
Debug.Print DynamicObj.Value
'//这个时候,Value输出的是 Text1 的Text属性值
当然了,当我么访问 DynamicObj.Text 的时候, 其实 DynamicClassFactory 返回的是一个 Property 对象,其有一个默认属性就是 Value
由此,我们实现更改属性称谓的实现也可以通过下面方式来进行
DynamicObj.Text.Name = "Value"
Debug.Print DynamicObj.Value
VB6可以说称不上支持重载,我有的时候疑惑,为什么不能在设置 Textbox 的 Enabled 属性为 False 的同时,其背景色同时换成灰色?即,我是否可以有一个机制,可以让一个类继承了 TextBox 的大多属性的同时
对其 Enabled 属性有一个扩充(重载)?答案是否定的,VB6不提供类似机制.
而我的 DynamicClassFactory 做到了这一点
DynamicObj.Enabled = Flase
'//Text1 将 Disable,同时其背景色为灰
有的时候 , 我们取得一个记录集(ADODB.Recordset), 在取值时候, 要逐个字段判断其值是否为NULL, 很烦恼.如果您有类似的烦恼, 请阅读下去!
Dim Properties As DynamicClassFactory.Properties
Dim SQL As String
Dim Recordset As ADODB.Recordset
SQL = "SELECT Name ,Age ,Sex From StudentsInfo"
Set Recordset = g_Cn.Execute(SQL)
Call DynamicObj.Bind(Recordset)
这个时候 DynamicObj 将绑定到这个记录集,并按照 这个记录集的字段生成相应属性,并支持访问
Set Properties = DynamicObj.Properties
For Each Property In Properties
Debug.Print Property.Name & ":" & Property.Value
Next
'//遍历属性成员
Debug.Print DynamicObj.Name
'//访问属性成员
当然了,如果把 DynamicObj 的 BoundMode 设置成 BoundAutomatic(自动绑定)时,则当 Recordset 的 AbsolutePosition 发生变动时候, DynamicObj 各属性成员是动态刷新的,请看下面的例子
Recordset.MoveFirst
DynamicObj.BoundMode = BoundAutomatic
Do While Not Recordset.EOF
Debug.Print DynamicObj.Name
Recordset.MoveNext
Loop
'//逐条输出学生的姓名
当然了也可以:
Recordset.MoveFirst
DynamicObj.BoundMode = BoundManual '//手动绑定
Do While Not Recordset.EOF
Call DynamicObj.Refresh '//手动刷新
Debug.Print DynamicObj.Name
Recordset.MoveNext
Loop
'//逐条输出学生的姓名
DynamicClassFactory 不仅支持对象创建时的继承\运行中绑定 Recordset,还支持运行中继承,支持对普通类实例或是单层结构的 Type(UserDataType) 进行继承
'//比如我们有如下的一个结构
Public Type LinkManType
Name As String
Company As String '//公司
Telephone As String '//电话
MobilePhone As String '//移动电话
Position As String '//职务
End Type
'//下面演示结构继承
Dim LinkMan As LinkManType
LinkMan.Company = "微软"
LinkMan.MobilePhone = "1361920XXXX"
LinkMan.Name = "周XX"
LinkMan.Position = "经理"
LinkMan.Telephone = "029-8888888"
Call DynamicObj.ExtendFrom(LinkMan)
Debug.Print DynamicObj.Name
'//输出 我的姓名
如果我们有一个类,有上述 LinkManType 的结构,其实例名称为 cLinkMan,我们一样可以调用 ExtendFrom 来实现继承,至于手动对属性成员进行增\删\改,更是不在话下.
下次介绍函数重载及多态.敬请关注.
- <iframe width="200" height="22" align="center,center" id="iframeu1636200_0" src="http://pos.baidu.com/rczm?rdid=1636200&dc=2&di=u1636200&dri=0&dis=0&dai=2&ps=3285x396&dcb=BAIDU_SSP_define&dtm=BAIDU_DUP_SETJSONADSLOT&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1462502514237&ti=%E5%9C%A8VB6%E4%B8%8B%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E7%BB%A7%E6%89%BF%2C%E9%87%8D%E8%BD%BD%E5%92%8C%E5%A4%9A%E6%80%81----DynamicClassFactory%20(%E4%B8%80)-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET&ari=1&dbv=0&drs=3&pcs=1371x683&pss=1371x13396&cfv=20&cpl=2&chi=2&cce=true&cec=utf-8&tlm=1462502514&ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F120038095&ltr=http%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D7oOHcTB2kSSfM-Mq4-WdXdpcIGIvdqUXwTds20-9pMC2wo5sHufC8IarxtlYinZU%26wd%3D%26eqid%3Daa562fa50002d78b00000005572c03d0&ecd=1&psr=1371x857&par=1371x779&pis=-1x-1&ccd=24&cja=true&cmi=4&col=zh-CN&cdo=-1&tcn=1462502514&qn=e5ab2ca8a9e62312&tt=1462502514221.26.261.262" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" vspace="0" hspace="0" style="margin: 0px; border: 0px currentColor; border-image: none; vertical-align: bottom;" allowtransparency="true"></iframe>
- <iframe width="200" height="22" align="center,center" id="iframeu1636201_0" src="http://pos.baidu.com/rczm?rdid=1636201&dc=2&di=u1636201&dri=0&dis=0&dai=3&ps=3285x650&dcb=BAIDU_SSP_define&dtm=BAIDU_DUP_SETJSONADSLOT&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1462502514237&ti=%E5%9C%A8VB6%E4%B8%8B%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E7%BB%A7%E6%89%BF%2C%E9%87%8D%E8%BD%BD%E5%92%8C%E5%A4%9A%E6%80%81----DynamicClassFactory%20(%E4%B8%80)-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET&ari=1&dbv=0&drs=3&pcs=1371x683&pss=1371x13396&cfv=20&cpl=2&chi=2&cce=true&cec=utf-8&tlm=1462502514&ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F120038095&ltr=http%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D7oOHcTB2kSSfM-Mq4-WdXdpcIGIvdqUXwTds20-9pMC2wo5sHufC8IarxtlYinZU%26wd%3D%26eqid%3Daa562fa50002d78b00000005572c03d0&ecd=1&psr=1371x857&par=1371x779&pis=-1x-1&ccd=24&cja=true&cmi=4&col=zh-CN&cdo=-1&tcn=1462502514&qn=89bc8d0acfc38ed7&tt=1462502514221.29.291.291" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" vspace="0" hspace="0" style="margin: 0px; border: 0px currentColor; border-image: none; vertical-align: bottom;" allowtransparency="true"></iframe>
- <iframe width="200" height="22" align="center,center" id="iframeu1636204_0" src="http://pos.baidu.com/rczm?rdid=1636204&dc=2&di=u1636204&dri=0&dis=0&dai=4&ps=3285x904&dcb=BAIDU_SSP_define&dtm=BAIDU_DUP_SETJSONADSLOT&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1462502514237&ti=%E5%9C%A8VB6%E4%B8%8B%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E7%BB%A7%E6%89%BF%2C%E9%87%8D%E8%BD%BD%E5%92%8C%E5%A4%9A%E6%80%81----DynamicClassFactory%20(%E4%B8%80)-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET&ari=1&dbv=0&drs=3&pcs=1371x683&pss=1371x13396&cfv=20&cpl=2&chi=2&cce=true&cec=utf-8&tlm=1462502514&ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F120038095&ltr=http%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D7oOHcTB2kSSfM-Mq4-WdXdpcIGIvdqUXwTds20-9pMC2wo5sHufC8IarxtlYinZU%26wd%3D%26eqid%3Daa562fa50002d78b00000005572c03d0&ecd=1&psr=1371x857&par=1371x779&pis=-1x-1&ccd=24&cja=true&cmi=4&col=zh-CN&cdo=-1&tcn=1462502514&qn=99662fbc8264c5bb&tt=1462502514221.31.281.281" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" vspace="0" hspace="0" style="margin: 0px; border: 0px currentColor; border-image: none; vertical-align: bottom;" allowtransparency="true"></iframe>
对我有用[0]丢个板砖[0] 引用 | 举报 |
回复次数:29 编辑删除
管理 - 取消关注
- 关注
- cqq_chen
- cqq_chen
- 本版等级:本版专家分:13943
- 结帖率:100%
#1 得分:0回复于: 2007-08-06 12:49:28
谁做的?
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- zzz1117
- zzz1117
- 本版等级:本版专家分:30
- 结帖率:25%
#2 得分:0回复于: 2007-08-06 12:52:05
本人呵呵
还没出品呵呵
还没出品呵呵
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- guyehanxinlei
- guyehanxinlei
- 本版等级:本版专家分:6775
- 结帖率:100%
#3 得分:0回复于: 2007-08-06 12:52:18
观察一下
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- zzyong00
- zzyong00
- 本版等级:本版专家分:21812
- 结帖率:100%
- 红花2007年8月 VB大版内专家分月排行榜第一
- 黄花2008年5月 VB大版内专家分月排行榜第二
- 蓝花2008年1月 VB大版内专家分月排行榜第三
2007年11月 VB大版内专家分月排行榜第三
#4 得分:0回复于: 2007-08-06 12:52:55
看起来似乎很强啊
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- zzz1117
- zzz1117
- 本版等级:本版专家分:30
- 结帖率:25%
#5 得分:0回复于: 2007-08-06 12:53:44
月底我会出测试版.现在还没有最终完成呵呵
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- cqq_chen
- cqq_chen
- 本版等级:本版专家分:13943
- 结帖率:100%
#6 得分:0回复于: 2007-08-06 12:56:36
microsoft和找你算帐的,哈哈哈......
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- zzz1117
- zzz1117
- 本版等级:本版专家分:30
- 结帖率:25%
#7 得分:0回复于: 2007-08-06 12:58:23
呵呵,开玩笑的呵呵.
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- zzz1117
- zzz1117
- 本版等级:本版专家分:30
- 结帖率:25%
#8 得分:0回复于: 2007-08-06 12:59:03
只是弥补一下VB6的缺憾呵呵.如果要真正用OO的方式编程,该选择.NET,Java
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- hongqi162
- hongqi162
- 本版等级:本版专家分:2495
- 结帖率:100%
- 进士2007年 总版技术专家分年内排行榜第九
- 铜牌2007年7月 总版技术专家分月排行榜第三
更多勋章- 红花2007年9月 Oracle大版内专家分月排行榜第一
2007年7月 Oracle大版内专家分月排行榜第一
2007年6月 Oracle大版内专家分月排行榜第一
2008年7月 Delphi大版内专家分月排行榜第一
2008年3月 Delphi大版内专家分月排行榜第一
2008年2月 Delphi大版内专家分月排行榜第一
2007年12月 Delphi大版内专家分月排行榜第一
2007年11月 Delphi大版内专家分月排行榜第一
2007年10月 Delphi大版内专家分月排行榜第一
2007年9月 Delphi大版内专家分月排行榜第一
2007年7月 Delphi大版内专家分月排行榜第一
2007年6月 Delphi大版内专家分月排行榜第一
2007年4月 Delphi大版内专家分月排行榜第一
2007年1月 Delphi大版内专家分月排行榜第一
#9 得分:0回复于: 2007-08-06 13:01:26
mark
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- yangzn76
- yangzn76
- 本版等级:本版专家分:353
- 结帖率:100%
#10 得分:0回复于: 2007-08-06 21:52:22
先顶再说
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- DengXingJie
- DengXingJie
- 本版等级:本版专家分:10888
- 结帖率:100%
#11 得分:0回复于: 2007-08-07 15:17:22
不錯
真做出來?
真做出來?
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- sworddx
- sworddx
- 本版等级:本版专家分:8826
- 结帖率:100%
#12 得分:0回复于: 2007-08-07 15:23:25
“又来一帖,继续顶起。”
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- zzz1117
- zzz1117
- 本版等级:本版专家分:30
- 结帖率:25%
#13 得分:0回复于: 2007-08-07 16:48:36
等着吧呵呵.这个月绝对提供大家测试版使用.
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- zzz1117
- zzz1117
- 本版等级:本版专家分:30
- 结帖率:25%
#14 得分:0回复于: 2007-08-13 16:48:39
谁有空间提供?测试版本出炉,我要上传,但是没有帮助文件提供呵呵
最近太忙了,两个项目并着走,只能隔三差五抽点时间来写呵呵。
最近太忙了,两个项目并着走,只能隔三差五抽点时间来写呵呵。
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- kmlxk
- kmlxk0
- 本版等级:本版专家分:6349
- 结帖率:100%
#15 得分:0回复于: 2007-08-13 17:01:52
惊世骇俗啊~~~恐怖
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- zq972
- zq972
- 本版等级:本版专家分:14113
- 结帖率:94.44%
- 红花2006年12月 VB大版内专家分月排行榜第一
- 黄花2006年9月 VB大版内专家分月排行榜第二
- 蓝花2006年11月 VB大版内专家分月排行榜第三
2006年10月 VB大版内专家分月排行榜第三
#16 得分:0回复于: 2007-08-13 17:02:07
up一下,正在转C#,
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- zzz1117
- zzz1117
- 本版等级:本版专家分:30
- 结帖率:25%
#17 得分:0回复于: 2007-08-13 18:15:33
呵呵,大家可以不必看上面的介绍了:
[摘要]
DynamicClassFactory ,一个支持在VB6里实现真正意义的继承,多态,重载的库,目前,DynamicClassFactory还在开发中,预计月底出测试版,届时提供网友下载使用.
[正文]
DynamicClassFactory 将从根本上改变 VB6 开发者写作 类 的思维方式,支持您以纯面向对象的方式书写 类,比如:
Public clsMyClass As DynamicClassFactory.Class
Set clsMyClass = DynamicClassFactory.NewClass(ClassName:="clsMyClass", CodeContainer:= Me)
这样,一个新类就诞生了,名称为 clsMyClass,代码写作的位置在 Me
类该具备一些成员函数,下面增加成员函数,看看 DynamicClassFactory 如果是如何处理的
Call clsMyClass.Members.Add(Name:="MyFunc", InvokeType:=[Invoke Func],DefaultValue=Empty , ProcAddress:=1)
这样,类就添加了一个名称 为 MyFunc 的函数,函数处理代码 放在 Me 的倒数第 1 (ProcAddress) 个 方法中
这样,clsMyClass 的实例在调用 MyFunc 的函数时,将自动映射到 Me 中的该代码块,如下例,
Private Sub MyFunc(Member As DynamicClassFactory.Member, InvokeType As DynamicClassFactory.InvokeTypeEnum, Pms As DynamicClassFactory.Parameters, This As DynamicClassFactory.This, Result As DynamicClassFactory.Result)
Result.Value = Pms(1).Value & Pms(2).Value & Pms(3).Value
'//取得函数 返回值
End Sub
代码定义完毕,我们来尝试调用
Dim MyInstance As Object
Set MyInstance = clsMyClass.NewInstance()
'//取得 clsMyClass 的新实例
Debug.Print MyInstance.MyFunc("A", "B", "C")
我们 Debug 输出的结果将是 "ABC"
有的时候,让们定义 某类成员处理函数的次序(ProcIndex),是很麻烦的,那有没有更好的处理办法呢?同样的例子,我们写在模块里,将更醒目,请注意 InitclsMyClass 中的第二行代码:
Public clsMyClass As DynamicClassFactory.Class
Public Sub InitclsMyClass()
'//负责初始化 clsMyClass 类模板
Set clsMyClass = DynamicClassFactory.NewClass(ClassName:="clsMyClass")
Call clsMyClass.Members.Add(Name:="MyFunc", InvokeType:=[Invoke Func],DefaultValue=Empty , ProcAddress:=AddressOf MyFunc)
'//添加以一个成员函数,其处理过程指向下面的 MyFunc 函数
End Sub
Public Sub MyFunc(Member As DynamicClassFactory.Member, InvokeType As DynamicClassFactory.InvokeTypeEnum, Pms As DynamicClassFactory.Parameters, This As DynamicClassFactory.This, Result As DynamicClassFactory.Result)
Result.Value = Pms(1).Value & Pms(2).Value & Pms(3).Value
'//取得函数 返回值
End Sub
当然了,当我们调用其实例的 MyFunc 函数时,将自动指向该Proc 进行处理,如:
Dim MyInstance As Object
Set MyInstance = clsMyClass.NewInstance()
'//取得 clsMyClass 的新实例
Debug.Print MyInstance.MyFunc("A", "B", "C")
当然了,我们也可以这样来调用该接口:
Dim MyInstance As Object
Dim Func as DynamicClassFactory.Func
Set MyInstance = clsMyClass.NewInstance()
'//取得 clsMyClass 的新实例
Set Func = MyInstance.getFunc("MyFunc")
'//获得该成员函数
Debug.Print Func.Invoke("A", "B", "C")
'//输出
这样的效果跟上述是一样的。
待续,更多的精彩还在后头,下篇介绍,继承,多态,重载。
[摘要]
DynamicClassFactory ,一个支持在VB6里实现真正意义的继承,多态,重载的库,目前,DynamicClassFactory还在开发中,预计月底出测试版,届时提供网友下载使用.
[正文]
DynamicClassFactory 将从根本上改变 VB6 开发者写作 类 的思维方式,支持您以纯面向对象的方式书写 类,比如:
Public clsMyClass As DynamicClassFactory.Class
Set clsMyClass = DynamicClassFactory.NewClass(ClassName:="clsMyClass", CodeContainer:= Me)
这样,一个新类就诞生了,名称为 clsMyClass,代码写作的位置在 Me
类该具备一些成员函数,下面增加成员函数,看看 DynamicClassFactory 如果是如何处理的
Call clsMyClass.Members.Add(Name:="MyFunc", InvokeType:=[Invoke Func],DefaultValue=Empty , ProcAddress:=1)
这样,类就添加了一个名称 为 MyFunc 的函数,函数处理代码 放在 Me 的倒数第 1 (ProcAddress) 个 方法中
这样,clsMyClass 的实例在调用 MyFunc 的函数时,将自动映射到 Me 中的该代码块,如下例,
Private Sub MyFunc(Member As DynamicClassFactory.Member, InvokeType As DynamicClassFactory.InvokeTypeEnum, Pms As DynamicClassFactory.Parameters, This As DynamicClassFactory.This, Result As DynamicClassFactory.Result)
Result.Value = Pms(1).Value & Pms(2).Value & Pms(3).Value
'//取得函数 返回值
End Sub
代码定义完毕,我们来尝试调用
Dim MyInstance As Object
Set MyInstance = clsMyClass.NewInstance()
'//取得 clsMyClass 的新实例
Debug.Print MyInstance.MyFunc("A", "B", "C")
我们 Debug 输出的结果将是 "ABC"
有的时候,让们定义 某类成员处理函数的次序(ProcIndex),是很麻烦的,那有没有更好的处理办法呢?同样的例子,我们写在模块里,将更醒目,请注意 InitclsMyClass 中的第二行代码:
Public clsMyClass As DynamicClassFactory.Class
Public Sub InitclsMyClass()
'//负责初始化 clsMyClass 类模板
Set clsMyClass = DynamicClassFactory.NewClass(ClassName:="clsMyClass")
Call clsMyClass.Members.Add(Name:="MyFunc", InvokeType:=[Invoke Func],DefaultValue=Empty , ProcAddress:=AddressOf MyFunc)
'//添加以一个成员函数,其处理过程指向下面的 MyFunc 函数
End Sub
Public Sub MyFunc(Member As DynamicClassFactory.Member, InvokeType As DynamicClassFactory.InvokeTypeEnum, Pms As DynamicClassFactory.Parameters, This As DynamicClassFactory.This, Result As DynamicClassFactory.Result)
Result.Value = Pms(1).Value & Pms(2).Value & Pms(3).Value
'//取得函数 返回值
End Sub
当然了,当我们调用其实例的 MyFunc 函数时,将自动指向该Proc 进行处理,如:
Dim MyInstance As Object
Set MyInstance = clsMyClass.NewInstance()
'//取得 clsMyClass 的新实例
Debug.Print MyInstance.MyFunc("A", "B", "C")
当然了,我们也可以这样来调用该接口:
Dim MyInstance As Object
Dim Func as DynamicClassFactory.Func
Set MyInstance = clsMyClass.NewInstance()
'//取得 clsMyClass 的新实例
Set Func = MyInstance.getFunc("MyFunc")
'//获得该成员函数
Debug.Print Func.Invoke("A", "B", "C")
'//输出
这样的效果跟上述是一样的。
待续,更多的精彩还在后头,下篇介绍,继承,多态,重载。
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- zzz1117
- zzz1117
- 本版等级:本版专家分:30
- 结帖率:25%
#18 得分:0回复于: 2007-08-13 18:20:17
有劳斑竹把第一楼的介绍换成最后的这篇介绍,适当的话给排排版。呵呵。我没权限。谢谢了呵呵
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- zzz1117
- zzz1117
- 本版等级:本版专家分:30
- 结帖率:25%
#19 得分:0回复于: 2007-08-14 09:12:02
算了,没人响应,就不发布了,就拿着自己用吧呵呵。请求斑竹删贴,把前一篇也一起删除:
http://community.csdn.net/Expert/topic/5694/5694549.xml?temp=.5872614
http://community.csdn.net/Expert/topic/5694/5694549.xml?temp=.5872614
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- kmlxk
- kmlxk0
- 本版等级:本版专家分:6349
- 结帖率:100%
#20 得分:0回复于: 2007-08-14 09:33:19
不会吧,楼主,这么恐怖的东西,开源好拉
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- zzyong00
- zzyong00
- 本版等级:本版专家分:21812
- 结帖率:100%
- 红花2007年8月 VB大版内专家分月排行榜第一
- 黄花2008年5月 VB大版内专家分月排行榜第二
- 蓝花2008年1月 VB大版内专家分月排行榜第三
2007年11月 VB大版内专家分月排行榜第三
#21 得分:0回复于: 2007-08-14 09:46:35
楼主,你在调大家胃口呢?我们都有拭目以待呢
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- zzz1117
- zzz1117
- 本版等级:本版专家分:30
- 结帖率:25%
#22 得分:0回复于: 2007-08-14 10:15:22
呵呵。我写个示例先。中午放出来,我到华军上找个地址。呵呵。帮助文档,现在没时间弄呵呵。
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- zzz1117
- zzz1117
- 本版等级:本版专家分:30
- 结帖率:25%
#23 得分:0回复于: 2007-08-14 16:21:28
文件已经上传,在如下地址,
http://file.mofile.com/
然后左上角输入文件提取码,然后点提取文件,就可以下载了。
这是个 Demo 版的,让大家看看呵呵。还称不上测试版呵呵。
http://file.mofile.com/
然后左上角输入文件提取码,然后点提取文件,就可以下载了。
这是个 Demo 版的,让大家看看呵呵。还称不上测试版呵呵。
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- zzz1117
- zzz1117
- 本版等级:本版专家分:30
- 结帖率:25%
#24 得分:0回复于: 2007-08-14 16:25:19
Demo 中的 NormalTest 演示 DynamicClassFactory 是如何凭空创建类,并实现类的继承,多态,函数重载等特性。
示例中用了三个类,最基础的类是 clsDog(狗),clsShepherdDog (牧羊犬),clsChinaShepherdDog(中国牧羊犬)
clsDog 有两个属性和一个函数方法
EyeNumber 眼睛的数量
LegNumber 腿的数量
Yaff 吠叫 函数原型 Yaff(ToYaff As String)
clsShepherdDog 继承自clsDog ,另外还具备自己的特性:
Shepherd 放养,函数原型为 Shepherd(intCount As Integer),代表领着几只羊出去放
另外,有一点 clsShepherdDog 很厉害,他的 Yaff 跟普通的狗不一样,普通的狗所有的东东都可以,而 clsShepherdDog 只会说 Yes Sir 和 No Sir
老大当然是我们的 中国牧羊犬(clsChinaShepherdDog) 了,他除了继承 普通牧羊犬 的所有特性外,还有一点就是他很聪明,可以知道放羊结束后数羊(Count)然后向主人汇报结果(Report)
Count 见到羊就数数量,并作加法运算,累计数量, 函数原型 Count(intCount As Integer)
Report 汇报数量
下面的例子将演示一只中国牧羊犬放羊,数羊并回来汇报的过程
提供的机制非常简单,但是您能用这个机制写出什么类,那是我所没有办法想象的,因为这已经具备了OOP的最基本特质。
这个版本由于是初级版本,速度还是一个问题,我会在下面的版本中注意这些特性的。
下个版本中,我将增加构造函数的部分。
最后,这个东东纯粹是为了弥补 Vb6 的一些缺憾,如果要想更爽地 OOP 建议用 DotNet 或是 Java,还有,就是不建议大面积使用,因为速度可能是一个无法突破的瓶颈。
谢谢关注!
Howtell Soft
示例中用了三个类,最基础的类是 clsDog(狗),clsShepherdDog (牧羊犬),clsChinaShepherdDog(中国牧羊犬)
clsDog 有两个属性和一个函数方法
EyeNumber 眼睛的数量
LegNumber 腿的数量
Yaff 吠叫 函数原型 Yaff(ToYaff As String)
clsShepherdDog 继承自clsDog ,另外还具备自己的特性:
Shepherd 放养,函数原型为 Shepherd(intCount As Integer),代表领着几只羊出去放
另外,有一点 clsShepherdDog 很厉害,他的 Yaff 跟普通的狗不一样,普通的狗所有的东东都可以,而 clsShepherdDog 只会说 Yes Sir 和 No Sir
老大当然是我们的 中国牧羊犬(clsChinaShepherdDog) 了,他除了继承 普通牧羊犬 的所有特性外,还有一点就是他很聪明,可以知道放羊结束后数羊(Count)然后向主人汇报结果(Report)
Count 见到羊就数数量,并作加法运算,累计数量, 函数原型 Count(intCount As Integer)
Report 汇报数量
下面的例子将演示一只中国牧羊犬放羊,数羊并回来汇报的过程
提供的机制非常简单,但是您能用这个机制写出什么类,那是我所没有办法想象的,因为这已经具备了OOP的最基本特质。
这个版本由于是初级版本,速度还是一个问题,我会在下面的版本中注意这些特性的。
下个版本中,我将增加构造函数的部分。
最后,这个东东纯粹是为了弥补 Vb6 的一些缺憾,如果要想更爽地 OOP 建议用 DotNet 或是 Java,还有,就是不建议大面积使用,因为速度可能是一个无法突破的瓶颈。
谢谢关注!
Howtell Soft
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- kmlxk
- kmlxk0
- 本版等级:本版专家分:6349
- 结帖率:100%
#25 得分:0回复于: 2007-08-14 17:26:18
支持,顶起
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- yangao
- yangao
- 本版等级:本版专家分:15944
- 结帖率:100%
#26 得分:0回复于: 2007-08-14 17:49:31
做好了 试下
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- zzz1117
- zzz1117
- 本版等级:本版专家分:30
- 结帖率:25%
#27 得分:0回复于: 2007-08-14 18:47:04
实在对不起呵呵。
文件提取码是 8141285808571687
文件提取码是 8141285808571687
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- zzz1117
- zzz1117
- 本版等级:本版专家分:30
- 结帖率:25%
#28 得分:0回复于: 2007-08-14 18:54:17
搬家了呵呵
以后访问的话在如下地址:http://community.csdn.net/Expert/topic/5709/5709823.xml?temp=.7294275
以后访问的话在如下地址:http://community.csdn.net/Expert/topic/5709/5709823.xml?temp=.7294275
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- myjian
- 嗷嗷叫的老马
- 本版等级:本版专家分:53761
- 结帖率:99.5%
- 微软MVP 2012年1月 荣获微软MVP称号
2011年1月 荣获微软MVP称号
- 黄花2007年9月 VB大版内专家分月排行榜第二
- 蓝花2008年3月 VB大版内专家分月排行榜第三
2007年8月 VB大版内专家分月排行榜第三
- 微软MVP 2012年1月 荣获微软MVP称号
#29 得分:0回复于: 2007-08-15 00:14:41
高手无处不在......
0 0
- 在VB6下如何实现继承,重载和多态----DynamicClassFactory
- VB6 如何实现多重接口继承
- 继承与多态 --- 下 --- 重载与重写、多态实现原理、纯虚函数
- 用VB6.0在Vista下实现全磨砂玻璃窗口
- 如何实现 C 语言的继承和多态
- C语言如何实现继承和多态
- C语言如何模拟C++实现继承和多态
- 理解继承、封装和多态,分清重载和重写
- java中的继承和多态以及重载和重写
- 重载和重写、继承和多态的区别
- 如何实现vb6和.net的联合调试
- 在VB6.0中怎么实现escape和unescape
- 重载,继承,重写和多态的区
- 重载,继承,重写和多态的区别
- 重载,继承,重写和多态的区别
- 重载,继承,重写和多态的区别
- 重载,继承,重写和多态的区别
- 重载,继承,重写和多态的区别
- windows下文件夹遍历
- MySQL监控系统Lepus
- STL中的排序算法
- Sublime Text 3 快捷键总结
- Android动画分析
- 在VB6下如何实现继承,重载和多态----DynamicClassFactory
- Yii的常用URL
- JS原型继承和类式继承
- nodepad++正则表达式使用
- AndroidStudio下SVN的关联与解除
- Hive安装
- ios开发之View属性hidden, opaque, alpha, opacity的区别
- 企业级JavaScript应用技术核心及HTML 5开发实践
- ios学习笔记之UIView