看到一个vb的源代码里面会有以下代码:  Dim a As SView
  Set a = New BUpdate
  a.attach "xxx"  'attach是SView的方法
从这里是不是可以看出BUpdate是SView的子类?
这样子定义对象会有什么好处?

解决方案 »

  1.   

    VB6不能呀,你这个attach是啥啊,还是用VB7及以后的版本吧.
      

  2.   

    VB6并不是“完全不可以继承”。继承分为“接口继承”与“实现继承”。VB6可以做接口继承。实现继承貌似也见到有人做出来过,但并不是VB6官方方案;接口继承却是VB6官方方案。你的这个代码中,SView应该是一个接口类,而BUpdate则应该是继承至这个接口。VB6中的接口继承,使用Implements关键字可完成。具体请参考MSDN。
      

  3.   

    顶5楼,接口继承....
    简单示例:
    加一个窗体,建3个类,示例代码:'类名:IProduct (这是一个接口类,也叫抽象类,方法中无需任何代码)Public ID As String         '产品ID
    Public Name As String       '产品名称'产品价格
    Public Function GetPrice() As Currency
        '由交易类决定是进价还是销售价
    End Function'---------------------------------------------------------------
    '类名: SO  (销售类)Option Explicit
    Implements IProductPrivate xID As String
    Private xName As StringPrivate Property Let IProduct_ID(ByVal RHS As String)
        xID = RHS
    End PropertyPrivate Property Get IProduct_ID() As String
        IProduct_ID = xID
    End PropertyPrivate Property Let IProduct_Name(ByVal RHS As String)
        xName = RHS
    End PropertyPrivate Property Get IProduct_Name() As String
        IProduct_Name = xName
    End PropertyPrivate Function IProduct_GetPrice() As Currency
        Dim sql As String
        sql = "SELECT price FROM IProduct WHERE ID='" & IProduct_ID & "'"
        '这个查询比如得到如下查询结果 IProduct_GetPrice=rs!price
        IProduct_GetPrice = 78.8
    End Function'---------------------------------------------------------------
    '类名:PO (采购类)
    Option Explicit
    Implements IProductPrivate xID As String
    Private xName As StringPrivate Property Let IProduct_ID(ByVal RHS As String)
        xID = RHS
    End PropertyPrivate Property Get IProduct_ID() As String
        IProduct_ID = xID
    End PropertyPrivate Property Let IProduct_Name(ByVal RHS As String)
        xName = RHS
    End PropertyPrivate Property Get IProduct_Name() As String
        IProduct_Name = xName
    End PropertyPrivate Function IProduct_GetPrice() As Currency
        Dim sql As String
        sql = "SELECT cost FROM IProduct WHERE ID='" & IProduct_ID & "'"
        '这个查询比如得到如下查询结果: IProduct_GetPrice=rs!cost
        IProduct_GetPrice = 32
    End Function'---------------------------------------------------------------
    '调用:
    Private Sub Command1_Click()
        Dim pt As IProduct
        
        Set pt = New PO     '采购
        With pt
            .ID = "006"
            .Name = "手机"
            Debug.Print "采购价: " & .GetPrice
        End With
        Set pt = Nothing
        
        Set pt = New SO     '销售
        With pt
            .ID = "006"
            .Name = "手机"
            Debug.Print "销售价: " & .GetPrice
        End With
        Set pt = Nothing
    End Sub
      

  4.   

    补充一下你的这个问题。在VB6里使用接口继承,我所知道的应用之一是为了逻辑结构,二是为了性能。以一个绘图程序为例。为了方便管理绘制的图象,一般是将各个图元作为对象管理。而图元很多,有方框,有圆,有点,有线。在绘制过程中,就要根据不同的图元,调用不同的对象的绘制过程。这里假设已有一幅画面由各种图元各一个而构成,并且每个图元是放在一个数组中进行保存的。那么,使用通常的方法,则这个数组要么声明为Object,要么是Collection。不然无法容纳不同的对象。这里就有性能问题,两者貌似都是后期绑定。在重绘时,循环取出图元的过程中,就需要类似下面的代码:dim MData() as object.....
    .....for I =0 to ubound(Mdata)
        call mdata(i).Draw(hdc)         <------  这里是后期绑定
    next
    而如果使用接口继承的话,先写一接口类,定义好接口,并让MData()声明为这个接口类的类型,则整个过程变成了前期绑定,这在大量使用时性能的区别是非常明显的。同样一段代码,将as object改为as IInterface:'IInterface.cls:public sub Draw(byval hdc as long)
        '绘制当前图元
    end sub
    这样的话,别的子类并不直接由任何的代码调用,与工程之间除了接口耦合,没有任何其它的耦合,方便合作开发,也方便维护,同时要添加更多类型的图元,也更加方便:工程逻辑------(调用)------>IInterface
                                                    |
                                                     ----cFrame(方框子类)
                                                     ----cLine(线子类)
                                                     ----cPoint(点子类)子类的管理就非常方便,很适合中大型软件的开发。不过代码量并不多,或者无需要维护(或很少维护),无多人合作开发等环境下,这种编程手法的优势就并不明显了。换句话说,这是ISO9000,不适合小厂:)