之间有什么区别
Public Variable As Integer
和
Private pVariable As Integer
Public Property Let Variable(ByVal lVariable As Integer)
pVariable = lVariable
End Property
Public Property Get Variable()
Variable = pVariable
End Property
在VBA类模块中?
为什么我会使用第二个版本?
答案 0 :(得分:20)
尽管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
错误有点不必要。
注意:您可以在需要处理错误/验证数据的情况下执行此操作,但通常情况下,只要设置和获取值,您就不会这样做< / em>的
如果您同时公开Let / Set和Get属性,为什么还需要私有支持字段?您需要的只是公共变量本身,不需要属性。
当你必须只展示其中一个属性而不是另一个属性(即只有setter或getter)时,故事会改变360度。通过一个例子,也许它更容易理解......
示例强>
让我们开始通过一个简单的银行&#34;例如(显然你在现实生活中不会在VBA中做到这一点,但它作为一个基础是一个很好的概念)
想象一下,你必须建立一个类来模拟银行账户。您需要从帐户deposit
和withdraw
获取资金,并显示balance
。
通常,您不会<{1>} setter
balance
字段,因为应该允许任何人明确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 OOP的介绍我可以推荐:
答案 1 :(得分:5)
属性允许外部访问,就好像属性是公共字段一样,同时允许类保持对数据的控制。
Get属性可以计算&#34;变量&#34;在课堂上实际上并不存在。例如。 质量获取属性可能会返回密度乘以体积的乘积。
Private density as Double
Private volume as Double
Private potentialEnergy
Public Property Get mass() As Double
mass = density*volume
End Property 'Property Get mass
让属性可能会检查有效性,例如不接受负数量。或者它可以使对象的字段属性保持同步:
Public Property Let density(rho as Double)
if rho > 0 then
density = rho
potentialEnergy = density * volume * gravity * height
End Property 'Property Get mass
通过省略Let或Get属性,您还可以将属性设置为只读(或只写 - 不会使用太多)。
除了性能略有下降之外,从一开始就允许公共访问的任何字段使用属性,即使属性最初是微不足道的,以便于将来修改类,这是一种很好的做法。