VB实现类继承的另类方法

来源:互联网 时间:1970-01-01

之前为了实现公司业务对比的功能,用VB写了个小工具去供应商处采集数据,通过本工具对业务进行对比。刚开始供应商比较少,没有按类的对象(类)的编写。随着供应商的增加,两三年下来,供应商已经增加到近20家,每家都有三四大类产品线。为了共用某些代码(XMLHTTP,正则,登录判断),代码都写到了一个模块里。

近期,有供应商改版了,需要对程序进行调整,发现仅采集模块就有1500行代码,基本都在一个过程(Sub)里,每改一次简直要疯一次。如果把公用方法写到一个类里,然后各个供应商都继承(Extend)这个类,岂不美哉。发现VB不是完全面向对象的语言,基本都是说道不可能。在贴吧一个帖子里(http://tieba.baidu.com/p/1795854449)提到VB6.0实现类的继承,用他的代码测试,也没有解决。简直是坑啊。。。。。实际他做到的是Implements。

VB的Implements搜索,竟然没有发现相关文档。看来又是一个。。。。

如上图,他做到了把类定义成了“接口”,然后他的子类实际上是去实现“接口”,实际没什么卵用。每个子类都需要把父类的所有方法都去重写一遍。

如果定义了属性,就爽呆呆了。每个属性都需要三个sub去设置。可惜公司不按代码行数发工资,如果按行发工资。每天几万行代码绝对没问题,而且都是是必须的代码。

按继承的方式,大约要实现的功能如下:

贴吧中的方法实现的是下面的方式:

虽然最终都能用下边的方法调用,但是定义类的工作量太大了,而且后期维护极难。

难道VB项目就没办法偷偷懒,用继承吗?好像还真没有。但是可以给每个类增加一个公共的变量。变量的值创建“父类”的实例。

Class ParentClassPublic Name As String, Age As String, Sex As StringPublic Caller As ObjectPublic Sub Eat(ByVal what) MsgBox "[" & Caller.ChildType & "] Eating " & whatEnd SubPublic Sub SetThis(ByVal handle) Set Caller = handleEnd SubEnd Class Class DogPublic This As ObjectPublic ChildType As StringPrivate Sub Class_Initialize() Set This = New ParentClass ChildType = "Dog"End SubEnd Class Class PeoplePublic This As ObjectPublic ChildType As StringPrivate Sub Class_Initialize() Set This = New ParentClass ChildType = "People"End SubPublic Sub Study(ByVal what) MsgBox "[" & This.Caller.ChildType & "] Study " & whatEnd SubEnd Class

测试:

Dim zhang As Object, wang As Object Set zhang = New People Set wang = New Dog Call zhang.This.SetThis(zhang) Call wang.This.SetThis(wang) zhang.This.Name = "Zhang Meimei" zhang.This.Age = "35" zhang.This.Sex = "women" wang.This.Name = "Wang wangwang" wang.This.Age = "5" wang.This.Sex = "boy" Call zhang.This.Eat("meat") Call wang.This.Eat("bone") Call zhang.Study("day day up!")

因为 This 的类型已经固定,还可以写成:

Sub QuickSet(ByRef obj As ParentClass, _ByVal strName As String, _ByVal strAge As String, _ByVal strSex As String, _ByVal objCaller As Object) obj.Name = strName obj.Age = strAge obj.Sex = strSex Set obj.Caller = objCallerEnd SubDim zhang As Object, wang As ObjectSet zhang = New PeopleSet wang = New DogCall QuickSet(zhang.This, "Zhang Meimei", "35", "women", zhang)Call QuickSet(wang.This, "Wang wangwang", "5", "boy", wang)Call zhang.This.Eat("meat")Call wang.This.Eat("bone")Call zhang.Study("day day up!")

虽然不是 真正的 类继承,但是可以节省很多代码。也算是比较完美了


相关阅读:
Top