VBA:generics类定义

Allthough一个经验丰富的VBA程序员,我相当新的做自己的类(对象)。 为了预热,我制作了以下类模块 – 一个正常的VBA模块来testing它。 我对集合和数组特别感兴趣。 任何人都可以build议我是否正确的方式吗? – 还是可以改进?

最好的问候,Helge。

class级模块:

Option Explicit Option Base 1 Private Type TClass1 Name As String Coll As Collection Datas() As Variant End Type Private z As TClass1 Private Sub Class_Initialize() Set z.Coll = New Collection ReDim z.Datas(0 To 0) End Sub ' String Public Property Let Name(inValue As String) z.Name = inValue End Property Public Property Get Name() As String Name = z.Name End Property ' Collection Public Property Let Coll(inValue As Collection) Set z.Coll = inValue End Property Public Property Get Coll() As Collection Set Coll = z.Coll End Property Public Property Let Coll_Item(Index As Integer, inValue As Variant) ' If the position is already in collection, it is overwritten. Dim N As Integer, i As Integer N = z.Coll.Count If Index > N Then ' Also N = 0 For i = N + 1 To Index - 1 z.Coll.Add "" Next i z.Coll.Add inValue Else z.Coll.Remove (Index) If N = 1 Then ' Index is also 1. z.Coll.Add Item:=inValue Else If Index = 1 Then z.Coll.Add Item:=inValue, Before:=1 Else z.Coll.Add Item:=inValue, After:=Index - 1 End If End If End If End Property Public Property Get Coll_Item(Index As Integer) As Variant Coll_Item = z.Coll(Index) End Property Public Sub Coll_Add_Value(inValue As Variant) z.Coll.Add inValue End Sub Public Sub Coll_Delete_Value(inValue As Variant) ' Removes all occurrences of inValue. Dim i As Integer, N As Integer N = z.Coll.Count For i = N To 1 Step -1 If z.Coll(i) = inValue Then z.Coll.Remove i Next i End Sub Public Sub Coll_Delete_Item(Item As Integer) z.Coll.Remove Item End Sub Public Function Coll_Count() As Integer Coll_Count = 0 On Error Resume Next Coll_Count = z.Coll.Count On Error GoTo 0 End Function Public Sub Coll_Clear() Set z.Coll = New Collection End Sub ' Variant array Public Sub Set_Datas(inValue() As Variant) z.Datas = inValue End Sub Public Property Get Datas() As Variant Datas = z.Datas End Property Public Property Let Data(Index As Integer, inValue As Variant) If Index <= UBound(z.Datas) Then z.Datas(Index) = inValue Else ReDim Preserve z.Datas(1 To Index) z.Datas(Index) = inValue End If End Property Public Property Get Data(Index As Integer) As Variant Data = z.Datas(Index) End Property Public Function Data_Count() As Integer Data_Count = 0 On Error Resume Next Data_Count = UBound(z.Datas) On Error GoTo 0 End Function Public Sub Datas_Clear() ReDim z.Datas(0 To 0) End Sub 

testing程序:

 Option Explicit Option Base 1 Sub Test() Dim X As Variant Dim Y As Variant Dim N As Integer Dim aColl As Collection, bColl As Collection Set aColl = New Collection aColl.Add "A" aColl.Add "B" Dim Arr1(1 To 3) As Variant Dim Arr2() As Variant Arr1(1) = 1 Arr1(2) = "B" Arr1(3) = 3 Dim objTest As cTest Set objTest = New cTest ' String objTest.Name = "John Doe" ' Public Property Let Name(inValue As String) X = objTest.Name ' Public Property Get Name() As String ' Collection objTest.Coll = aColl ' Public Property Let Coll(inValue As Collection) Set bColl = objTest.Coll ' Public Property Get Coll() As Collection objTest.Coll_Item(1) = 1 ' Public Property Let Coll_Item(Index As Integer, inValue As Variant) objTest.Coll_Item(2) = "BB" objTest.Coll_Item(4) = 4 X = objTest.Coll_Item(1) ' Public Property Get Coll_Item(Index As Integer) As Variant Y = objTest.Coll_Item(2) objTest.Coll_Add_Value "Added" ' Public Sub Coll_Add_Value(inValue As Variant) objTest.Coll_Delete_Value "BB" ' Public Sub Coll_Delete_Value(inValue As Variant) objTest.Coll_Delete_Value 1 objTest.Coll_Delete_Item 1 ' Public Sub Coll_Delete_Item(Item As Integer) N = objTest.Coll_Count ' Public Function Coll_Count() As Integer objTest.Coll_Clear ' Public Sub Clear_SetDefinitions() ' Variant array objTest.Set_Datas Arr1 ' Public Sub Set_Datas(inValue() As Variant) Arr2 = objTest.Datas ' Public Property Get Datas() As Variant objTest.Data(1) = "AA" ' Public Property Let Data(Index As Integer, inValue As Variant) objTest.Data(2) = 22 objTest.Data(5) = "Five" ' Increased upper bound. X = objTest.Data(1) ' Public Property Get Data(Index As Integer) As Variant Y = objTest.Data(2) N = objTest.Data_Count ' Public Function Data_Count() As Integer objTest.Datas_Clear ' Public Sub Datas_Clear() N = objTest.Data_Count End Sub