演练:用 COM 对象实现继承 (Visual Basic)

你可以从 COM 对象中的 Public 类派生 Visual Basic 类,即使这些类是在早期版本的 Visual Basic 中创建的。 可以替代或重载从 COM 对象继承的类的属性和方法,就像替代或重载任何其他基类的属性和方法一样。 如果不想重新编译现有类库,从 COM 对象继承很有用。

以下过程说明如何使用 Visual Basic 6.0 创建一个包含类的 COM 对象,然后将其用作基类。

注意

以下说明中的某些 Visual Studio 用户界面元素在计算机上出现的名称或位置可能会不同。 这些元素取决于你所使用的 Visual Studio 版本和你所使用的设置。 有关详细信息,请参阅个性化设置 IDE

生成本演练中使用的 COM 对象

  1. 在 Visual Basic 6.0 中,打开一个新的 ActiveX DLL 项目。 系统会创建一个名为 Project1 的项目。 它有一个名为 Class1 的类。

  2. 在项目资源管理器中,右键单击“Project1”,然后单击“Project1 属性”。 随即显示“项目属性”对话框。

  3. 在“项目属性”对话框的“常规”选项卡上,通过在“项目名称”字段中键入 ComObject1 来更改项目名称。

  4. 在项目资源管理器中,右键单击 Class1,然后单击“属性”。 随即显示该类的“属性”窗口。

  5. Name 属性更改为 MathFunctions

  6. 在项目资源管理器中,右键单击 MathFunctions,然后单击“查看代码”。 随即显示“代码编辑器”。

  7. 添加一个局部变量来保存属性值:

    ' Local variable to hold property value
    Private mvarProp1 As Integer
    
  8. 添加 Property Let 和 Property Get 属性过程:

    Public Property Let Prop1(ByVal vData As Integer)
       'Used when assigning a value to the property.
       mvarProp1 = vData
    End Property
    Public Property Get Prop1() As Integer
       'Used when retrieving a property's value.
       Prop1 = mvarProp1
    End Property
    
  9. 添加函数:

    Function AddNumbers(
       ByVal SomeNumber As Integer,
       ByVal AnotherNumber As Integer) As Integer
    
       AddNumbers = SomeNumber + AnotherNumber
    End Function
    
  10. 通过单击“文件”菜单上的“生成 ComObject1.dll”来创建和注册 COM 对象。

    注意

    尽管还可以将使用 Visual Basic 创建的类公开为 COM 对象,但它不是真正的 COM 对象,不能在本演练中使用。 有关详细信息,请参阅 .NET Framework 应用程序中的 COM 互操作性

互操作程序集

在以下过程中,你将创建一个互操作程序集,充当非托管代码(例如 COM 对象)和 Visual Studio 使用的托管代码之间的桥梁。 Visual Basic 创建的互操作程序集处理使用 COM 对象的许多细节,例如互操作封送处理(在 COM 对象之间移动参数和返回值时将其打包成等效数据类型的过程)。 Visual Basic 应用程序中的引用指向互操作程序集,而不是实际的 COM 对象。

在 Visual Basic 2005 及更高版本中使用 COM 对象

  1. 打开一个新的 Visual Basic Windows 应用程序项目。

  2. 在“项目”菜单上,单击“添加引用” 。

    将显示“添加引用”对话框。

  3. 在“COM”选项卡上,双击“组件名称”列表中的 ComObject1,然后单击“确定”。

  4. “项目” 菜单上,单击 “添加新项”

    随即出现“添加新项”对话框。

  5. 在“模板”窗格中,单击“类”。

    默认文件名 Class1.vb 显示在“名称”字段中。 将此字段更改为 MathClass.vb 并单击“添加”。 这将创建一个名为 MathClass 的类,并显示其代码。

  6. 将以下代码添加到 MathClass 顶部,以从 COM 类继承。

    ' The inherited class is called MathFunctions in the base class,
    ' but the interop assembly appends the word Class to the name.
    Inherits ComObject1.MathFunctionsClass
    
  7. 通过将以下代码添加到 MathClass 来重载基类的公共方法:

    '  This method overloads the method AddNumbers from the base class.
    Overloads Function AddNumbers(
        ByVal SomeNumber As Integer,
        ByVal AnotherNumber As Integer) As Integer
    
        Return SomeNumber + AnotherNumber
    End Function
    
  8. 通过将以下代码添加到 MathClass 来扩展继承类:

    '  The following function extends the inherited class.
    Function SubtractNumbers(
        ByVal SomeNumber As Integer,
        ByVal AnotherNumber As Integer) As Integer
    
        Return AnotherNumber - SomeNumber
    End Function
    

新类继承 COM 对象中基类的属性,重载方法,并定义新方法来扩展类。

测试继承类

  1. 向启动窗体添加一个按钮,然后双击该按钮以查看其代码。

  2. 在按钮的 Click 事件处理程序过程中,添加以下代码以创建 MathClass 的实例并调用重载方法:

    Dim Result1 As Short
    Dim Result2 As Integer
    Dim Result3 As Integer
    Dim MathObject As New MathClass
    Result1 = MathObject.AddNumbers(4S, 2S) ' Add two Shorts.
    Result2 = MathObject.AddNumbers(4, 2) 'Add two Integers.
    Result3 = MathObject.SubtractNumbers(2, 4) ' Subtract 2 from 4.
    MathObject.Prop1 = 6 ' Set an inherited property.
    
    MsgBox("Calling the AddNumbers method in the base class " &
           "using Short type numbers 4 and 2 = " & Result1)
    MsgBox("Calling the overloaded AddNumbers method using " &
           "Integer type numbers 4 and 2 = " & Result2)
    MsgBox("Calling the SubtractNumbers method " &
           "subtracting 2 from 4 = " & Result3)
    MsgBox("The value of the inherited property is " &
            MathObject.Prop1)
    
  3. 按 F5 运行项目。

单击窗体上的按钮时,首先使用 Short 数据类型数字调用 AddNumbers 方法,Visual Basic 会从基类中选择适当的方法。 对 AddNumbers 的第二次调用会定向到 MathClass 中的重载方法。 第三次调用将调用扩展类的 SubtractNumbers 方法。 设置基类中的属性,并显示值。

后续步骤

你可能已经注意到,重载的 AddNumbers 函数似乎与从 COM 对象的基类继承的方法具有相同的数据类型。 这是因为基类方法的实参和形参在 Visual Basic 6.0 中定义为 16 位整数,但在更高版本的 Visual Basic 中公开为 Short 类型的 16 位整数。 新函数接受 32 位整数,并重载基类函数。

使用 COM 对象时,请确保验证参数的大小和数据类型。 例如,使用接受 Visual Basic 6.0 集合对象作为参数的 COM 对象时,不能提供来自更高版本的 Visual Basic 的集合。

可以替代从 COM 类继承的属性和方法,这意味着你可以声明一个本地属性或方法来替换从基 COM 类继承的属性或方法。 替代继承 COM 属性的规则类似于替代其他属性和方法的规则,但有以下例外:

  • 如果替代从 COM 类继承的任何属性或方法,则必须替代所有其他继承属性和方法。

  • 不能替代使用 ByRef 参数的属性。

另请参阅