VB实现类继承的另类方法

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

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

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

1

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

2

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

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

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

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

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

Class ParentClass
	Public Name   As String, Age As String, Sex As String
	Public Caller As Object

	Public Sub Eat(ByVal what)
	    MsgBox "[" & Caller.ChildType & "] Eating " & what
	End Sub

	Public Sub SetThis(ByVal handle)
	    Set Caller = handle
	End Sub
End Class
Class Dog
	Public This      As Object
	Public ChildType As String

	Private Sub Class_Initialize()
	    Set This = New ParentClass
	    ChildType = "Dog"
	End Sub
End Class
Class People
	Public This      As Object
	Public ChildType As String

	Private Sub Class_Initialize()
	    Set This = New ParentClass
	    ChildType = "People"
	End Sub

	Public Sub Study(ByVal what)
	    MsgBox "[" & This.Caller.ChildType & "] Study " & what
	End Sub

End 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 = objCaller
    End Sub

    Dim zhang As Object, wang As Object
    
    Set zhang = New People
    Set wang = New Dog
    
    Call 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!")

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.