具有私有变量的VBA Factory方法

时间:2014-08-21 00:09:22

标签: excel vba excel-vba

所以我有Factory类,方法为Create_product

Product碰巧有私人变量,我希望Factory设置私有变量,但如果它们是私有的,我怎样才能让Factory访问它们?

我希望在创建Product的新实例后无法更改它们。

2 个答案:

答案 0 :(得分:1)

<强>朋友

修改表单模块或类模块中过程的定义,以使过程可以从类外部的模块调用,但是可以在其中定义类的项目的一部分。朋友程序不能用于标准模块。

<强>语法

[Private | Friend | Public] [Static] [Sub | Function | Property] procedurename

所需的procedurename是在整个项目中可见的过程的名称,但对于该类的控制器是不可见的。

<强>说明

类中的公共过程可以从任何地方调用,甚至可以通过类实例的控制器来调用。声明一个过程Private可以防止对象的控制器调用该过程,但也可以防止从定义类本身的项目中调用该过程。 Friend使程序在整个项目中可见,但不对对象实例的控制器可见。朋友只能出现在表单模块和类模块中,并且只能修改过程名称,而不能修改变量或类型。类中的过程可以访问项目中所有其他类的Friend过程。朋友程序不会出现在他们班级的类型库中。朋友程序不能迟到。

答案 1 :(得分:0)

使用单例类1

创建名为Singleton的表单模块:

Private SingleInsts As Collection
Private instCount As Double
Public isCalled As Boolean 

Private Sub UserForm_Initialize()
    Me.Hide
    Me.isCalled = False
End Sub

Private Function setInstance(name As String) As Object
    Dim Obj As Object
    If SingleInsts Is Nothing Then Set SingleInsts = New Collection
    instCount = SingleInsts.Count
    ReDim singleNames(instCount + 1)
    Me.isCalled = True
    Select Case name
        Case "Example"
            Set Obj = New Example
        Case "Other"
            Set Obj = New Other 'etc. etc - Case ... for all classes
        Case Else    
            Err.Raise vbObjectError + 800, Err.Source & "|" & Me.name & "." & "setInstance", name & " is not a classname"

    End Select
    Me.isCalled = False
    SingleInsts.Add Obj, name
    Set setInstance = Obj
    Exit Function
End Function

Public Function getInstance(name As String) As Object
    On Error Resume Next
    If (SingleInsts(name) Is Nothing) And False Then
        'this way only by error - when SingleInsts(name) doesn't exist 
        Set getInstance = setInstance(name)
    Else
        Set getInstance = SingleInsts(name)
    End If
End Function

Public Function errNew(errstr As String)
    Err.Raise vbObjectError + 703, errstr 
End Function

此功能必须在所有类中:

Private Sub Class_Initialize()
 If Not Singleton.isCalled Then Singleton.errNew TypeName(Me)
End Sub 

然后致电&#34;工厂&#34;获取对象的方法(一个对象只能实例化一次 - 参见Singleton中的getInstance方法)

Sub fo()
    set alfa = Singleton.getInstance("Example")
End sub