楼主
发表于: 2007-08-06 12:43:30
[摘要]
DynamicClassFactory,一个支持在VB6里实现继承,多态,重载的库,目前,DynamicClassFactory还在开发中,预计月底出测试版,届时提供网友下载使用.本文仅仅介绍对属性继承的实现,下一篇将集中介绍函数的继承\多态\重载,敬请关注. [正文] //是不是在为VB6对继承支持得不好而发愁?是不是在为VB6没有重载而发愁?有类似疑惑的话,请继续阅读,DynamicClassFactory将为您解开这些疑惑. '//有的时候,在编程时,老感觉某个控件的属性少了点什么,比如Tag属性为什么只有一个?其实我们只是在想记录更多的信息 DimDynamicObjAsObject SetDynamicObj=DynamicClassFactory.NewObj(Me.Text1) '//从DynamicClassFactory中获得一个新类,该类将继承Text1的所有属性 Debug.PrintDynamicObj.Text '//输出其文本 DynamicObj.Properties.Add"NewTag",[AString],"增加一个Tag属性" Debug.PrintDynamicObj.NewTag '//增加了一个属性NewTag,并试图访问 有的时候,我疑惑TextBox有Text属性,而DTpicker有Value属性,同出而异名,异曲而同工,能不能也通过Value来访问TextBox的Text属性呢?DynamicClassFactory将支持你这么做. DimPropertyAsDynamicClassFactory.Property SetProperty=DynamicObj.Properties("Text") Property.Name="Value" Debug.PrintDynamicObj.Value '//这个时候,Value输出的是Text1的Text属性值 当然了,当我么访问DynamicObj.Text的时候,其实DynamicClassFactory返回的是一个Property对象,其有一个默认属性就是Value 由此,我们实现更改属性称谓的实现也可以通过下面方式来进行 DynamicObj.Text.Name="Value" Debug.PrintDynamicObj.Value VB6可以说称不上支持重载,我有的时候疑惑,为什么不能在设置TextBox的Enabled属性为False的同时,其背景色同时换成灰色?即,我是否可以有一个机制,可以让一个类继承了TextBox的大多属性的同时 对其Enabled属性有一个扩充(重载)?答案是否定的,VB6不提供类似机制. 而我的DynamicClassFactory做到了这一点 DynamicObj.Enabled=Flase '//Text1将Disable,同时其背景色为灰 有的时候,我们取得一个记录集(ADODB.Recordset),在取值时候,要逐个字段判断其值是否为NULL,很烦恼.如果您有类似的烦恼,请阅读下去! DimPropertiesAsDynamicClassFactory.Properties DimsqlAsString DimRecordsetAsADODB.Recordset sql="SELECTName,Age,SexFromStudentsInfo" SetRecordset=g_Cn.Execute(sql) CallDynamicObj.Bind(Recordset) 这个时候DynamicObj将绑定到这个记录集,并按照这个记录集的字段生成相应属性,并支持访问 SetProperties=DynamicObj.Properties ForEachPropertyInProperties Debug.PrintProperty.Name&":"&Property.Value Next '//遍历属性成员 Debug.PrintDynamicObj.Name '//访问属性成员 当然了,如果把DynamicObj的BoundMode设置成BoundAutomatic(自动绑定)时,则当Recordset的AbsolutePosition发生变动时候,DynamicObj各属性成员是动态刷新的,请看下面的例子 Recordset.MoveFirst DynamicObj.BoundMode=BoundAutomatic DoWhileNotRecordset.EOF Debug.PrintDynamicObj.Name Recordset.MoveNext Loop '//逐条输出学生的姓名 当然了也可以: Recordset.MoveFirst DynamicObj.BoundMode=BoundManual'//手动绑定 DoWhileNotRecordset.EOF CallDynamicObj.Refresh'//手动刷新 Debug.PrintDynamicObj.Name Recordset.MoveNext Loop '//逐条输出学生的姓名 DynamicClassFactory不仅支持对象创建时的继承\运行中绑定Recordset,还支持运行中继承,支持对普通类实例或是单层结构的Type(UserDataType)进行继承 '//比如我们有如下的一个结构 PublicTypeLinkManType NameAsString CompanyAsString'//公司 TelephoneAsString'//电话 MobilePhoneAsString'//移动电话 PositionAsString'//职务 EndType '//下面演示结构继承 DimLinkManAsLinkManType LinkMan.Company="微软" LinkMan.MobilePhone="1361920XXXX" LinkMan.Name="周XX" LinkMan.Position="经理" LinkMan.Telephone="029-8888888" CallDynamicObj.ExtendFrom(LinkMan) Debug.PrintDynamicObj.Name '//输出我的姓名 如果我们有一个类,有上述LinkManType的结构,其实例名称为cLinkMan,我们一样可以调用ExtendFrom来实现继承,至于手动对属性成员进行增\删\改,更是不在话下. 下次介绍函数重载及多态.敬请关注. |
|
谁做的?
|
|
本人呵呵
还没出品呵呵 |
|
|
观察一下
|
看起来似乎很强啊
|
|
月底我会出测试版.现在还没有最终完成呵呵
|
|
microsoft和找你算帐的,哈哈哈......
|
|
呵呵,开玩笑的呵呵.
|
|
只是弥补一下VB6的缺憾呵呵.如果要真正用OO的方式编程,该选择.NET,Java
|
|
|
mark
|
先顶再说
|
|
|
不錯
真做出來? |
“又来一帖,继续顶起。”
|
|
等着吧呵呵.这个月绝对提供大家测试版使用.
|
|
惊世骇俗啊~~~恐怖
|
|
up一下,正在转C#,
|
|
呵呵,大家可以不必看上面的介绍了:
[摘要] DynamicClassFactory,一个支持在VB6里实现真正意义的继承,届时提供网友下载使用. [正文] DynamicClassFactory将从根本上改变VB6开发者写作类的思维方式,支持您以纯面向对象的方式书写类,比如: PublicclsMyClassAsDynamicClassFactory.Class SetclsMyClass=DynamicClassFactory.NewClass(ClassName:="clsMyClass",CodeContainer:=Me) 这样,一个新类就诞生了,名称为clsMyClass,代码写作的位置在Me 类该具备一些成员函数,下面增加成员函数,看看DynamicClassFactory如果是如何处理的 CallclsMyClass.Members.Add(Name:="MyFunc",InvokeType:=[InvokeFunc],DefaultValue=Empty,ProcAddress:=1) 这样,类就添加了一个名称为MyFunc的函数,函数处理代码放在Me的倒数第1(ProcAddress)个方法中 这样,clsMyClass的实例在调用MyFunc的函数时,将自动映射到Me中的该代码块,如下例, PrivateSubMyFunc(MemberAsDynamicClassFactory.Member,InvokeTypeAsDynamicClassFactory.InvokeTypeEnum,PmsAsDynamicClassFactory.Parameters,ThisAsDynamicClassFactory.This,ResultAsDynamicClassFactory.Result) Result.Value=Pms(1).Value&Pms(2).Value&Pms(3).Value '//取得函数返回值 EndSub 代码定义完毕,我们来尝试调用 DimMyInstanceAsObject SetMyInstance=clsMyClass.NewInstance() '//取得clsMyClass的新实例 Debug.PrintMyInstance.MyFunc("A","B","C") 我们Debug输出的结果将是"ABC" 有的时候,让们定义某类成员处理函数的次序(ProcIndex),是很麻烦的,那有没有更好的处理办法呢?同样的例子,我们写在模块里,将更醒目,请注意InitclsMyClass中的第二行代码: PublicclsMyClassAsDynamicClassFactory.Class PublicSubInitclsMyClass() '//负责初始化clsMyClass类模板 SetclsMyClass=DynamicClassFactory.NewClass(ClassName:="clsMyClass") CallclsMyClass.Members.Add(Name:="MyFunc",ProcAddress:=AddressOfMyFunc) '//添加以一个成员函数,其处理过程指向下面的MyFunc函数 EndSub PublicSubMyFunc(MemberAsDynamicClassFactory.Member,ResultAsDynamicClassFactory.Result) Result.Value=Pms(1).Value&Pms(2).Value&Pms(3).Value '//取得函数返回值 EndSub 当然了,当我们调用其实例的MyFunc函数时,将自动指向该Proc进行处理,如: DimMyInstanceAsObject SetMyInstance=clsMyClass.NewInstance() '//取得clsMyClass的新实例 Debug.PrintMyInstance.MyFunc("A","C") 当然了,我们也可以这样来调用该接口: DimMyInstanceAsObject DimFuncasDynamicClassFactory.Func SetMyInstance=clsMyClass.NewInstance() '//取得clsMyClass的新实例 SetFunc=MyInstance.getFunc("MyFunc") '//获得该成员函数 Debug.PrintFunc.Invoke("A","C") '//输出 这样的效果跟上述是一样的。 待续,更多的精彩还在后头,下篇介绍,继承,多态,重载。 |
|
有劳斑竹把第一楼的介绍换成最后的这篇介绍,适当的话给排排版。呵呵。我没权限。谢谢了呵呵
|
|
算了,没人响应,就不发布了,就拿着自己用吧呵呵。请求斑竹删贴,把前一篇也一起删除:
http://community.csdn.net/Expert/topic/5694/5694549.xml?temp=.5872614 |
|
不会吧,楼主,这么恐怖的东西,开源好拉
|
|
楼主,你在调大家胃口呢?我们都有拭目以待呢
|
|
呵呵。我写个示例先。中午放出来,我到华军上找个地址。呵呵。帮助文档,现在没时间弄呵呵。
|
|
Demo中的NormalTest演示DynamicClassFactory是如何凭空创建类,并实现类的继承,多态,函数重载等特性。
示例中用了三个类,最基础的类是clsDog(狗),clsShepherdDog(牧羊犬),clsChinaShepherdDog(中国牧羊犬) clsDog有两个属性和一个函数方法 EyeNumber眼睛的数量 LegNumber腿的数量 Yaff吠叫函数原型Yaff(ToYaffAsString) clsShepherdDog继承自clsDog,另外还具备自己的特性: Shepherd放养,函数原型为Shepherd(intCountAsInteger),代表领着几只羊出去放 另外,有一点clsShepherdDog很厉害,他的Yaff跟普通的狗不一样,普通的狗所有的东东都可以,而clsShepherdDog只会说YesSir和NoSir 老大当然是我们的中国牧羊犬(clsChinaShepherdDog)了,他除了继承普通牧羊犬的所有特性外,还有一点就是他很聪明,可以知道放羊结束后数羊(Count)然后向主人汇报结果(Report) Count见到羊就数数量,并作加法运算,累计数量,函数原型Count(intCountAsInteger) Report汇报数量 下面的例子将演示一只中国牧羊犬放羊,数羊并回来汇报的过程 提供的机制非常简单,但是您能用这个机制写出什么类,那是我所没有办法想象的,因为这已经具备了OOP的最基本特质。 这个版本由于是初级版本,速度还是一个问题,我会在下面的版本中注意这些特性的。 下个版本中,我将增加构造函数的部分。 最后,这个东东纯粹是为了弥补Vb6的一些缺憾,如果要想更爽地OOP建议用DotNet或是Java,还有,就是不建议大面积使用,因为速度可能是一个无法突破的瓶颈。 谢谢关注! HowtellSoft |
|
支持,顶起
|
|
做好了试下
|
|
搬家了呵呵
以后访问的话在如下地址:http://community.csdn.net/Expert/topic/5709/5709823.xml?temp=.7294275 |
|
高手无处不在......
|