对 Visual Basic 中的模块进行面向对象的更改

更新:2007 年 11 月

共享成员(如属性和过程等)是可供类的所有实例使用,但不与类的任何特定实例相关联的类成员。有关共享成员的更多信息,请参见 Visual Basic 中的共享成员

实例数据和共享数据

实例数据是执行 New 关键字时创建的数据集。与之相反,类的共享数据的创建与任何 New 关键字的执行都无关。

Visual Basic 6.0

Visual Basic 6.0 在类定义中不支持共享数据。若要跨类实例共享数据,请在模块中使用全局变量。

Visual Basic 2008

通过将 Shared (Visual Basic) 修饰符添加到变量声明语句,可声明共享数据,如下所示。

Private Shared totalInstances As Integer

共享方法

Visual Basic 6.0

Visual Basic 6.0 不支持共享类成员。可通过模块获得类似功能。运行库仅为模块中的数据创建一个实例。模块中的数据和方法的作用范围为整个项目。下面是一个在模块中实现的库的示例:

Public Sub GetTitle(wordXml As String)
    ' Add code here to find title in Xml string.
End Sub

Public Sub ReplaceTitle(wordXml As String, newTitle As String)
    ' Add code here to replace title.
End Sub

Visual Basic 2008

对于模块,更为面向对象的方法是使用共享的类成员,前提是这些成员和库一样彼此相关,或者这些成员与某个现有类相关。代码设计将决定是否共享所有成员,或者类是否同时具有共享成员和实例成员。如果类只具有共享成员,只添加私有构造函数将使类无法通过客户端代码实例化。下面的示例演示一个无法通过客户端代码进行实例化的类以及调用该类某个成员的客户端代码。

Public Class WordLibrary
    Public Shared Sub GetTitle(ByVal wordXml As String)
        ' Add code here to find title in Xml string.
    End Sub

    Public Shared Sub ReplaceTitle(ByVal wordXml As String, _
        ByVal newTitle As String)
        ' Add code here to replace title.
    End Sub

    Private Sub New()
        ' This prevents instantiation of the class in the client.
    End Sub
End Class
' Code that calls the library method.
Sub ChangeTheTitle()
    WordLibrary.ReplaceTitle("Old Title", "New Title")
End Sub

与使用模块相比,为库使用类的优点包括:

  • 库具有名称 - WordLibrary,它可在代码中显式调用。

  • 方法被分组到一个类中,指出了它们之间的相互关系。

  • 私有构造函数的使用使得该类提供了一组实用工具方法这一点变得十分清晰。

  • 客户端代码使用库名,使读者对项目的组织结构一目了然。

在 .NET Framework 中,共享方法通常用于提供与类相关的功能,但不需要类的实例。Parse 方法即是一个示例,.NET Framework 中的许多数据类型都支持该方法。Integer 数据类型 (Visual Basic) 支持采用字符串作为参数的 Parse 方法。Parse 方法返回字符串表示的整数。Parse 方法作为成员方法并无意义。因为没有要操作的整数值,只有一个字符串。

访问共享成员

Visual Basic 6.0

Visual Basic 6.0 不支持共享类成员。

Visual Basic 2008

可以使用类名或实例名访问共享成员,如下所示。

WordLibrary.ReplaceTitle("Old Title", "New Title")

除非对类实例的引用传递给了共享方法,否则共享方法不能访问任何实例数据。

升级建议

将 Visual Basic 6.0 WordLibrary 模块升级为以下代码:

Module WordLibrary
    Public Sub GetTitle(ByRef wordXml As String)
        ' Add code here to find title in Xml string.
    End Sub

    Public Sub ReplaceTitle(ByRef wordXml As String, _
        ByRef newTitle As String)
        ' Add code here to replace title.
    End Sub
End Module

将模块代码从 Visual Basic 6.0 升级到 Visual Basic 2008 时,请考虑以下内容:

  • 将模块方法和数据组织到类中,作为共享数据和方法。

  • 如果模块方法与现有类相关,则将这些方法移到相应类中,作为共享方法。

请参见

概念

Visual Basic 中的共享成员