可以从 COM 对象中的 Public
类派生 Visual Basic 类,甚至是从早期版本的 Visual Basic 中创建的类。 继承自 COM 对象的类的属性和方法可以重写或重载,就像可以重写或重载任何其他基类的属性和方法一样。 COM 对象的继承在拥有不希望重新编译的现有类库时非常有用。
以下过程演示如何使用 Visual Basic 6.0 创建包含类的 COM 对象,然后将其用作基类。
注释
计算机可能会在以下说明中显示某些 Visual Studio 用户界面元素的不同名称或位置。 你拥有的 Visual Studio 版本以及所使用的设置决定了这些元素。 有关更多信息,请参阅 自定义 IDE。
生成本演练中使用的 COM 对象
在 Visual Basic 6.0 中,打开新的 ActiveX DLL 项目。 将创建一个名为
Project1
的项目。 它有一个名为Class1
的类。在 项目资源管理器中,右键单击 Project1,然后单击 Project1 属性。 将显示 “项目属性 ”对话框。
在“项目属性”对话框的“常规”选项卡上,通过在“项目名称”字段中键入
ComObject1
来更改项目名称。在 项目资源管理器中,右键单击
Class1
,然后单击“ 属性”。 类的“属性”窗口已显示。将
Name
属性更改为MathFunctions
。在 项目资源管理器中,右键单击
MathFunctions
,然后单击“ 查看代码”。 将显示 代码编辑器 。添加一个本地变量来保存属性值:
' Local variable to hold property value Private mvarProp1 As Integer
添加 Property
Let
和 PropertyGet
属性过程: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
添加函数:
Function AddNumbers( ByVal SomeNumber As Integer, ByVal AnotherNumber As Integer) As Integer AddNumbers = SomeNumber + AnotherNumber End Function
通过在文件菜单中单击“Make ComObject1.dll”来创建和注册 COM 对象。
注释
尽管还可以公开使用 Visual Basic 作为 COM 对象创建的类,但它不是真正的 COM 对象,不能在此演练中使用。 有关详细信息,请参阅 .NET Framework 应用程序中的 COM 互作性。
互操作程序集
在以下过程中,你将创建互作程序集,该程序集充当非托管代码(如 COM 对象)与托管代码 Visual Studio 使用的桥梁。 Visual Basic 创建的互操作程序集处理了许多与 COM 对象交互的详细事项,例如 互操作封送,它是将参数和返回值打包成等效数据类型的过程,用于参数和值在 COM 对象之间的传递。 Visual Basic 应用程序中的引用指向互作程序集,而不是实际的 COM 对象。
将 COM 对象与 Visual Basic 2005 及更高版本配合使用
打开新的 Visual Basic Windows 应用程序项目。
在 项目 菜单上,单击 添加引用。
将显示“ 添加引用 ”对话框。
在“COM”选项卡上,双击“
ComObject1
组件名称”列表中,然后单击“确定”。在“项目”菜单上,单击 “添加新项”。
将显示“ 添加新项 ”对话框。
在 “模板 ”窗格中,单击“ 类”。
默认文件名
Class1.vb
显示在 “名称” 字段中。 将此字段更改为MathClass.vb,然后单击“ 添加”。 这将创建一个名为MathClass
的类,并显示其代码。将以下代码添加到
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
通过将以下代码添加到
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
通过将以下代码添加到
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 对象中基类的属性,重载方法,并定义用于扩展类的新方法。
测试继承类
将按钮添加到启动窗体,然后双击它以查看其代码。
在按钮的
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)
按 F5 运行项目。
单击窗体上的按钮时,首先使用 AddNumbers
数据类型数字调用 Short
方法,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
参数的属性。