在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 dll下载吗
[解决办法]
有点意思。现在习惯了VB.net中OO的便利,回去VB6都不会写了。