在VBA中创建隐藏的类成员和成员函数

时间:2019-03-29 08:54:23

标签: excel vba

我已经看到,您可以在VBA中创建“隐藏”的东西,方法是在它们的名称前加上下划线(或其他一些非法的第一个字符)。 “隐藏”并不意味着私有,而是指不会在VBE自动完成中显示的公共事物。如果要使用它,必须知道它的存在。

最近看到的一些例子是:

foo(data3)类中的_NewEnum函数(来自this问题),我经常像这样创建Collection

Enum

因为这使我可以遍历枚举,而无需添加其他暴露的类别,这会使事情感到困惑。

我的问题是:除枚举外,是否可以将此构造用于其他用途?我看到Public Enum SomeEnumeration [_First] FirstCategory = [_First] SecondCategory ThirdCategory [_Last] = ThirdCategory [_Invalid] = [_Last] + 1 End Enum 可以做到,但是我自己可以做到这一点。即,我该如何编写具有隐藏功能的类模块:

Container

然后通过访问此功能

' Class module SomeClass

' Illustration of what I want, but this will not compile
Public Function _Hidden() As Variant
  ' Return something
End Function

我尝试用Dim Obj As New SomeClass Obj.[_Hidden] ' This option should not be visible in the VBE autocomplete 周围定义函数,但这也不起作用。

这很有用,因为我经常将类的默认实例用作对象工厂,以此作为VBA类构造函数不接受任何参数的变通方法。但是,这样做时会遇到一些问题,必须公开类的某些部分,这些部分实际上应该是私有的,并在构造函数中设置。如果我可以将这些东西命名为隐藏的东西,那将使我的界面更整洁,并防止意外使用。

1 个答案:

答案 0 :(得分:0)

如果您将类的默认实例用作具有create和self函数的工厂,则您可能还希望考虑使用接口作为仲裁器,以确定哪些函数是私有函数,哪些是公共函数。例如而不是对接口使用常规的I类命名约定,而是使用“ Classprivate”(即类定义)和“ Class”(即接口)。无意为多个相关对象提供接口,就像公共/私有过滤器一样。

这有很多优点。

  1. 您可以将类的所有方法和属性公开,从而大大简化单元测试。

  2. 工厂仅返回接口对象,因此对于您使用的是类实例还是接口,没有任何困惑。

用于VBA的Rubberduck外接程序使接口的创建几乎是微不足道的。