我已经定义了两个VBA类clsEmployee和clsEmployees。
类clsEmployee包含属性“Name”,EmployeeId和DOJ,以及用于读取和写入值的各自的let和get属性 和clsEmployees定义如下
Option Explicit
Option Base 1
Public pEmployees As Dictionary
Private Sub Class_Initialize()
Set pEmployees = New Dictionary
End Sub
Private Sub Class_Terminate()
Set pEmployees = Nothing
End Sub
Public Property Get Employee() As Dictionary
Set Employee = pEmployees
End Property
AFAIK当我们写入对象属性时调用属性,当我们读取类对象的属性时调用Get属性。
但任何人都可以解释为什么在执行以下语句时调用clsEmployees的Get属性
objEmployees.Employee.Add objEmployee, objEmployee
我觉得我们正在尝试设置/编写应该调用Let属性的Employees类对象的属性。
答案 0 :(得分:4)
调用Get
属性只是因为您引用它:
objEmployees.Employee.anything_here
将调用Get
例程。你可以看看这里的点来提供帮助。 第一个点获取Employee
对象,第二个点然后进行写入。所以最终它是一个写操作,但你先做了第一次。
如果您想避免这种情况,那么您可以使用AddEmployee
例程:
Sub AddEmployee(objEmployee As Employee)
' now you can reference the class member
pEmployees.Add objEmployee, objEmployee
End Sub
并使用objEmployees.AddEmployee objEmployee
调用它。这似乎有点不必要,但如果您想要验证哪些员工正在被添加,那么这种效用就会变得更加明显。简单检查是否存在第二次添加同一员工的问题 - 使用Function
而不是Sub
:
Function AddEmployee(objEmployee As Employee) As Boolean
Dim blnAdded as Boolean
If Not pEmployees.Exists(objEmployee) Then
pEmployees.Add objEmployee, objEmployee
blnAdded = True
Else
blnAdded = False
End if
AddEmployee = blnAdded
End Function
在您的代码中,因为您已将pEmployees声明为Public
,您实际上只能从Module
或其他任何代码中引用该代码:
pEmployees.Add objEmployee, objEmployee