在VBA中使用类模块作为命名空间是否存在任何缺陷

时间:2013-02-18 20:23:09

标签: oop vba

VBA不支持名称空间(Java poeple的包)。其他语言的命名空间有助于避免歧义,并补充自动填充成员名称等工具。

在VBA中模拟命名空间的一种方法是在Class模块中声明什么是defacto静态方法,然后在标准模块中声明该类的默认实例。这甚至是pattern followed in some Microsoft documentation。您也可以使用此方法来嵌套伪命名空间。

您,我的同行,您是否预计使用此方法会遇到任何技术问题?

这不是民意调查问题;我不是在询问正统或美学的吸引力。我问,“这会引起问题吗?如果是,那是什么?”

示例:

' Class module called clsIOText
Public Function ReadAllText(ByVal FileName As String) As String
    With New FileSystemObject
        With .OpenTextFile(FileName, ForReading)
            ReadAllText = .ReadAll
            .Close
        End With
    End With
End Function

' Class module call clsIO
Public Text As New clsIOText

' In a standard module somewhere
Public IO As New clsIO

' Usage like a namespace
' 1. Fully qualified
Debug.Print IO.Text.ReadAllText("C:\temp\example.txt")

' 2. With a namespace alias-like object
Dim Text As clsIOText
Text = IO.Text
Debug.Print Text.ReadAllText("C:\temp\example.txt")

1 个答案:

答案 0 :(得分:3)

到目前为止还没有其他答案......

我自己提出的陷阱是更多的限制和陷阱:

  1. 您需要将每个类的Instancing属性设置为“2 - PublicNotCreatable”。否则,如果项目已编译,然后从另一个项目引用,则成员将不会出现在对象浏览器中(尽管它们仍然可用)
  2. 您不能将类模块中的外部API声明声明为Public。为了将它们暴露给类外的代码,您必须将Declare作为私有,然后创建一个公共包装器方法。
  3. 这仍然不允许您组织命名空间中的类型 - 只包含静态方法的集合。
  4. 从查询和宏中,您只能调用标准模块中定义的全局方法。因此,要使用包含在命名空间类中的任何函数,您必须在标准模块中定义包装器,重新启动层次结构。