vba - 如何限制标准模块中的功能范围
问题描述
我准备了一个标准模块,MyPath
,其中包含一些有用的功能。在这种情况下,标准模块对我来说比类模块更好。
写起来更舒服:
Dim ext As String
ext = MyPath.getFileExtension("test.docx") ' returns "docx"
代替:
Dim Pth As MyPath
Set Pth = New MyPath
Dim ext As String
ext = Pth.getFileExtension("test.docx")
或类似的东西
Dim ext As String
With New MyPath
ext = .getFileExtension("test.docx")
End With
我的“伪静态类”模块的唯一问题是它的范围(和 IntelliSense 的使用)。
Dim ext As String
ext = getFileExtension("test.docx") ' This works, but I don't want it to
我想要实现的是:
- 如果调用函数时没有指定
MyPath
,IntelliSense 不会建议模块中的方法,并且它们不能使用。 - 为了使用
MyPath
模块中的任何方法,需要输入MyPath.
,并且在点 IntelliSense 之后应该建议模块中的方法。
我尝试了一些与Option Private Module
,Private
函数的组合,但没有人按照我描述的方式工作。
我正在准备很多课程和类似的模块,我会保持一切井井有条。
编辑
简而言之,如果我没有为函数或子指定“父”模块,我想强制编译器抛出错误。同时,如果我输入模块的名称,我将能够使用 IntelliSense(没有运行/调用的解决方案,只需输入模块名称、点并选择成员)。
解决方案
受 VBA 的 Err 对象启发的另一个解决方案是实现一个函数,该函数返回对“静态对象”的引用
Public Static Function MyPath() As PathObject
Dim result As PathObject
If result Is Nothing Then Set result = New PathObject
Set MyPath = result
End Function
PathObject
包含所有伪静态方法的类在哪里。
这种方法的额外好处是调用者不能将他们的 MyPath 引用设置为 Nothing - 如果您决定您的 Static 模块应该是有状态的(也许对于一些昂贵的初始化例程)
PS 我认为Static Function
语法很可爱,但你同样可以用 static 关键字声明结果
事实上,你可以让它更简洁
Public Static Function MyPath() As PathObject
Dim result As New PathObject
Set MyPath = result
End Function
MyPath
未经测试,但应该具有仅在第一次使用时才被实例化的行为,但此后会无限期地挂起
推荐阅读
- spring-boot - 如果连接关闭,我该如何处理连接并重新连接?
- javascript - 使用多个值过滤垫表
- ironpdf - IronPDF FormField 值与新行
- java - 从容器连接到 docker 主机
- objective-c - 艺术家如何创建非线性抽象插值渐变图像
- python - csv.read 在每条记录后插入空字段 - 解析问题
- java - 用于嵌套 HashMap 的自定义反序列化器,其接口具有两个使用 Jackson 的实现
- r - 使用 R Shiny 中的操作按钮将行从一个 DT 移动到其他 DT
- python - 寻找带有范围(绝对 Y 轴)堆积条的 PyQt5 图表
- c++ - vscode调试同一文件夹中的多个文件