演练:用 COM 对象实现继承
更新:2007 年 11 月
可以从 COM 对象的 Public 类派生 Visual Basic 类,甚至是那些用 Visual Basic 的早期版本创建的类。可以重写或重载从 COM 对象继承的类的属性和方法,方式与重写或重载任何其他基类的属性和方法的方式相同。当您拥有一个不想重新编译的现有类库时,从 COM 对象中继承是很有用的。
下面的过程说明如何使用 Visual Basic 6.0 创建包含类的 COM 对象,然后将它用作基类。
说明: |
---|
对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您使用的 Visual Studio 版本及设置。有关更多信息,请参见Visual Studio 设置。 |
生成在本演练中使用的 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
添加属性 Let 和属性 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
添加一个函数:
Function AddNumbers( _ ByVal SomeNumber As Integer, _ ByVal AnotherNumber As Integer) _ As Integer AddNumbers = SomeNumber + AnotherNumber End Function
在“文件”菜单上单击“生成 ComObject1.dll”,创建并注册 COM 对象。
说明: 虽然也可以将使用 Visual Basic 创建的类公开为 COM 对象,但它并不是真正的 COM 对象,也不能在本演练中使用。有关详细信息,请参见 .NET Framework 应用程序中的 COM 互操作性。
互操作程序集
在下面的过程中,将创建一个互操作程序集,它将作为非托管代码(如 COM 对象)和 Visual Studio 使用的托管代码之间的桥梁。Visual Basic 创建的互操作程序集将处理使用 COM 对象的许多细节问题,如互操作封送处理,它是在与 COM 对象之间来回移动参数和返回值时,将这些参数和返回值打包为等效数据类型的过程。Visual Basic 应用程序中的引用指向互操作程序集,而不是实际的 COM 对象。
在 Visual Basic 2005 及其更高版本中使用 COM 对象
打开一个新的 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 更高版本的集合。有关数据类型更改的更多信息,请参见 语言更改(针对 Visual Basic 6.0 用户)。
可以重写从 COM 类继承的属性和方法,这意味着您可以声明局部属性或方法来代替从 COM 基类继承的属性和方法。除以下不同之处外,重写继承的 COM 属性的规则与重写其他属性和方法的规则类似:
如果要重写任何从 COM 类继承的属性或方法,必须重写所有其他继承的属性和方法。
不能重写使用 ByRef 参数的属性。