所以我有Factory
类,方法为Create_product
Product
碰巧有私人变量,我希望Factory
设置私有变量,但如果它们是私有的,我怎样才能让Factory
访问它们?
我希望在创建Product
的新实例后无法更改它们。
答案 0 :(得分:1)
<强>朋友强>
修改表单模块或类模块中过程的定义,以使过程可以从类外部的模块调用,但是可以在其中定义类的项目的一部分。朋友程序不能用于标准模块。
<强>语法强>
[Private | Friend | Public] [Static] [Sub | Function | Property] procedurename
所需的procedurename是在整个项目中可见的过程的名称,但对于该类的控制器是不可见的。
<强>说明强>
类中的公共过程可以从任何地方调用,甚至可以通过类实例的控制器来调用。声明一个过程Private可以防止对象的控制器调用该过程,但也可以防止从定义类本身的项目中调用该过程。 Friend使程序在整个项目中可见,但不对对象实例的控制器可见。朋友只能出现在表单模块和类模块中,并且只能修改过程名称,而不能修改变量或类型。类中的过程可以访问项目中所有其他类的Friend过程。朋友程序不会出现在他们班级的类型库中。朋友程序不能迟到。
答案 1 :(得分:0)
创建名为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