我已经看到,您可以在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类构造函数不接受任何参数的变通方法。但是,这样做时会遇到一些问题,必须公开类的某些部分,这些部分实际上应该是私有的,并在构造函数中设置。如果我可以将这些东西命名为隐藏的东西,那将使我的界面更整洁,并防止意外使用。
答案 0 :(得分:0)
如果您将类的默认实例用作具有create和self函数的工厂,则您可能还希望考虑使用接口作为仲裁器,以确定哪些函数是私有函数,哪些是公共函数。例如而不是对接口使用常规的I类命名约定,而是使用“ Classprivate”(即类定义)和“ Class”(即接口)。无意为多个相关对象提供接口,就像公共/私有过滤器一样。
这有很多优点。
您可以将类的所有方法和属性公开,从而大大简化单元测试。
工厂仅返回接口对象,因此对于您使用的是类实例还是接口,没有任何困惑。
用于VBA的Rubberduck外接程序使接口的创建几乎是微不足道的。