VBA公共变量和属性之间的区别

时间:2014-07-01 12:26:23

标签: vba class oop properties interface

之间有什么区别
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类模块中?

为什么我会使用第二个版本?

2 个答案:

答案 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中做到这一点,但它作为一个基础是一个很好的概念)

想象一下,你必须建立一个类来模拟银行账户。您需要从帐户depositwithdraw获取资金,并显示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属性,您还可以将属性设置为只读(或只写 - 不会使用太多)。

除了性能略有下降之外,从一开始就允许公共访问的任何字段使用属性,即使属性最初是微不足道的,以便于将来修改类,这是一种很好的做法。