5

我已经在 excel 中使用 VBA 类模块有一段时间了,但我不确定我是否正确地创建了它们。我通常为类创建模块级变量,然后创建属性 let 和 get 函数。例如:

Private msRegion As String

Property Get Region() As String
    Region = msRegion 'Return the Region
End Property

Property Let Region(ByVal sRegionName As String)
    msRegion = sRegionName 'Set the Region
End Property

当我查看本地窗口中的对象时,我注意到对于每个属性,我最终都得到了模块作用域变量和 Let 函数所需的变量。这对我来说似乎是一个变量的重复。我担心,如果我将大量具有多个属性的对象集合起来,就资源而言可能会很昂贵。

我试图修改代码,以便对象类中只有一个变量,但到目前为止,我只收到了错误消息。

有谁知道在类模块中创建不会导致重复变量的属性的方法?

编辑:

我刚刚又看了看我的 locals 窗口,并意识到 let 属性的参数不存在。这两个表达式似乎是私有存储的变量和属性获取值,在本例中为 msRegion 和 Region。这符合 Cor_Blimey 的回答。

4

2 回答 2

5

您是否尝试在调用该类的代码中获取或设置 msRegion 属性?如果你这样做,你会注意到它是不可调用的。

您正在正确地构建课程。

locals 窗口显示所有声明的变量,包括类中的私有变量。

于 2013-08-19T19:15:46.260 回答
4

Declan_K 的说法是正确的,a) 你做得对,b) Locals 窗口忽略范围并显示它们。

补充一点为什么最好将它们分开并拥有一个公共属性和一个私有成员字段:

1)您可以在 Get/Set/Let 中拥有有用的有限“逻辑”。也许您希望以不同的格式存储值,但始终以另一种格式显示(例如,将其存储为 Long 毫秒数,但始终以 Double 秒返回),或者您希望在存储数据之前验证数据。

2)您定义了一个公共“接口”,它代表您的类和消费类之间的合同。因此,您可以清楚地区分您的类的内部结构(可以根据需要自由更改)和外部接口。这在 VBA 的实践中可能不是问题,因为您可能完全控制所有消费类,并且 VBA 按需编译,因此将字段更改为属性不是问题,反之亦然,但这是一种很好的做法,应该有助于实施更好的封装。它还将帮助您记住何时需要确保您没有在插件/程序的其他地方进行重大更改!

3)属性基本上不会为变量占用额外的存储空间。具有公共字段和具有私有支持字段的属性的情况下的存储要求基本相同。如果它对您有所帮助,请将其视为返回私有值的“函数”或设置私有值的“子”。

4)在某些情况下,您实际上可以节省资源:考虑一个具有返回对象的属性的类(如“结果”集合或其他东西)。在实际需要对象之前,您可以将支持字段保持为 Nothing,无论是通过类中的方法还是通过消费者通过属性请求它。当它被请求时,您可以根据需要实例化该对象。

5) Setter 和 Accessor 的单独作用域:字段要么是私有的,要么是公共的,所以如果它是公共的,你不能阻止,例如,一个字段被用来引用一个可能与你的状态不一致或可能不不一致的新对象类期望。另一方面,您可以将属性限制为只读等(请注意,这不会阻止只读对象更改其属性 - 它只会阻止引用更改)。同样,根据第 2 点,这对您来说可能根本不是问题,因为它在您的项目中并且毕竟只有 VBA,但它应该有助于确保您的类的属性(在更宽松的意义上)是不可或缺的您班级的功能由您的班级控制。

6)在其他语言中还有很多其他原因,但 VBA 确实有更少的原因。

另一方面,为您可能会或可能不会觉得有用的东西输入这么多文本是一件痛苦的事情!

于 2013-08-19T19:31:04.517 回答