尽管VBA是面向对象的,但在很多方面仍然有限制。不过,就这个例子而言,了解VBA中OOP的基础应该已经足够了。
你的代码
Private pVariable As Integer
Public Property Let Variable(ByVal lVariable As Integer)
pVariable = lVariable
End Property
Public Property Get Variable()
Variable = pVariable
End Property
is wrong a bit unnecessary是有点不必要的。
注意:在处理错误/验证传入数据时,您可以这样做,但通常如果只是简单地设置和获取值,则不会这样做。
如果您同时公开了Let/Set和Get属性,为什么还需要私有后备字段?对于此操作,您只需要公共变量本身,无需使用属性。
当您只需要公开其中一个属性而不是另一个属性(即仅setter或getter)时,情况就会完全改变。也许通过一个示例更容易理解...
示例
让我们从一个简单的“银行”示例开始工作(显然,您在现实生活中不会在VBA中这样做,但它是一个评估基础概念的好方法)
想象一下,您需要构建一个类来模拟银行账户。您需要一种方式来从账户中存款
和取款
以及显示余额
。
通常,您不会为balance
字段拥有setter
,因为不应允许任何人明确set
余额。(如果您知道一个允许这样做的银行,请告诉我;))。实际余额应该是一个私有变量。应该有一个公开它的属性,这就是您应该考虑的全部。
考虑一个VBA类(一个接口)
IAccountServices.cls
Sub Deposit(amount As Double)
End Sub
Sub WithDraw(amount As Double)
End Sub
还需要另一个类来表示账户
Account.cls
Implements IAccountServices
' balance should be private
' cause you should only have a getter for it
' you should only be able to set the balance inside this class
' based on the operations
Private accBalance As Double
' see Getter only - no setter
Public Property Get Balance() As Double
Balance = accBalance
End Property
Public Function Deposit(amount As Double)
accBalance = accBalance + amount
End Function
Public Function WithDraw(amount As Double)
accBalance = accBalance - amount
End Function
Private Sub IAccountServices_Deposit(amount As Double)
accBalance = accBalance + amount
End Sub
Private Sub IAccountServices_WithDraw(amount As Double)
accBalance = accBalance - amount
End Sub
注意:
这只是最简单的示例,没有任何错误处理或检查余额是否足以提取等。这只是为了演示目的而不用于实际应用。
通过封装,我立即知道:
accBalance
是一个私有字段,无法在类外部访问。
我只能检索 balance()
而不能在 Account
类的实例上明确设置它。
我可以从帐户中deposit()
和 withdraw()
钱(公开可访问的方法)。
在您的标准模块(module1)中,即使使用智能感知,也会列出 .Balance,这就是您的库/类用户需要担心的全部内容。
现在有一个标准编码模块来测试两个类(Module1)。
Sub Main()
Dim myAccount As Account
Set myAccount = New Account
Debug.Print "Starting Balance: " & myAccount.Balance
myAccount.Deposit (2000)
Debug.Print "Deposited: 2000"
myAccount.WithDraw (250)
Debug.Print "Withdrew: 250"
Debug.Print "Ending Balance: " & myAccount.Balance
' can't set balance
' myAccount.Balance = 999999999999999999999999
End Sub
如果你想了解VBA面向对象编程的入门知识,我可以推荐以下内容: