看到一个vb的源代码里面会有以下代码: Dim a As SView
Set a = New BUpdate
a.attach "xxx" 'attach是SView的方法
从这里是不是可以看出BUpdate是SView的子类?
这样子定义对象会有什么好处?
Set a = New BUpdate
a.attach "xxx" 'attach是SView的方法
从这里是不是可以看出BUpdate是SView的子类?
这样子定义对象会有什么好处?
简单示例:
加一个窗体,建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
.....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,不适合小厂:)