用 COM 对象实现继承(zz)
可以从 COM 对象的 Public 类中派生出 Visual Basic .NET 类,即使是那些由早期 Visual Basic 版本创建的类也是如此。可以重写或重载从 COM 对象继承的类的属性和方法,方式与重写或重载任何其他基类的属性和方法的方式相同。当您拥有一个不想重新编译的现有类库时,从 COM 对象中继承是很有用的。
下面的过程说明如何使用 Visual Basic 6.0 创建包含类的 COM 对象,然后将它用作 Visual Basic .NET 中的基类。
生成本演练使用的 COM 对象
- 在 Visual Basic 6.0 中,打开一个新的 ActiveX DLL 项目。名为 Project1 的项目是由名为
Class1的类创建的。 - 在“项目资源管理器”中,右击“Project1”,然后单击“Project1 属性”。显示“项目属性”对话框。
- 在“项目属性”对话框的“常规”选项卡上,通过在“项目名称”字段中输入
ComObject1可更该项目名称。 - 在“项目资源管理器”中,右击
Class1,然后单击“属性”。显示该类的“属性”窗口。 - 将“名称”属性更改为
MathFunctions。 - 在“项目资源管理器”中,右击
MathFunctions,然后单击“查看代码”。将显示代码编辑器。 - 添加一个局部变量以保留属性值:
' Local variable to hold property value Private mvarProp1 As Integer
- 添加 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 - 添加一个函数:
Function AddNumbers(SomeNumber As Integer, _ AnotherNumber As Integer) As Integer AddNumbers = SomeNumber + AnotherNumber End Function - 通过从“文件”菜单选择“生成 ComObject1.dll”可创建并注册 COM 对象。
注意 也可以用 Visual Basic .NET 来创建 COM 对象。有关详细信息,请参见 Visual Basic 和 Visual C# 中的 COM 互操作性。
Interop 程序集
在下面的过程中,将创建一个 Interop 程序集,它将作为非托管代码(如,一个 COM 对象)和 Visual Studio .NET 使用的托管代码之间的桥梁。Visual Basic 创建的互操作程序集处理采用 COM 对象的许多详细情况,如“互操作封送处理”,它是在参数和返回值移入或移出 COM 对象时将它们打包为等效数据类型的过程。Visual Basic .NET 应用程序中的引用指向该 Interop 程序集,而不是实际的 COM 对象。
在 Visual Basic .NET 中使用 COM 对象
- 打开一个新的 Visual Basic .NET“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(ByRef SomeNumber As Integer, _ ByRef AnotherNumber As Integer _ ) As Integer AddNumbers = SomeNumber + AnotherNumber End Function ' The following function extends the inherited class. Function SubtractNumbers(ByVal SomeNumber As Integer, _ ByVal AnotherNumber As Integer) As Integer SubtractNumbers = AnotherNumber - SomeNumber End Function
新类继承 COM 对象中基类的属性,重载一个方法并定义一个新方法来扩展该类。
要测试继承的类
- 将一个按钮添加到启动窗体中,然后双击该按钮以查看其代码。
- 在该按钮的 Click 事件处理程序过程中添加以下代码,创建 MathClass 的一个实例,并调用被重载的方法:
Dim Result1 As Integer Dim Result2 As Short 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 键运行项目。
在单击窗体上的按钮时,首先使用数据类型为 Short 的数调用 AddNumbers 方法,并且 Visual Basic .NET 从基类中选择适当的方法。第二次调用 AddNumbers 定向于 MathClass 的重载方法。第三次调用调用了扩展该类的 SubtractNumbers 方法。这样就设置了基类中的属性,并显示其值。
数据类型的差别
可能已经注意到,重载的 AddNumbers 函数与从 COM 对象基类继承的方法一样具有相同的数据类型。这是因为在 Visual Basic 6.0 中,基类方法的参数被定义为 16 位整数,但在 Visual Basic .NET 中以 Short 类型的 16 位整数公开。新的函数接受 32 位整数,并重载基类函数。
当处理 COM 对象时,验证参数的大小和数据类型是很重要的。例如,在使用以参数形式接受 Visual Basic 6.0 集合对象的 COM 对象时,不能提供 Visual Basic .NET 集合。有关数据类型更改的更多信息,请参见 Visual Basic 中的语言更改。
重写从 COM 类继承的属性和方法
可以重写从 COM 类继承的属性和方法,这意味着您可以声明局部属性或方法来代替从 COM 基类继承的属性和方法。除以下不同之处外,重写继承的 COM 属性的规则与重写其他属性和方法的规则类似:
- 如果要重写任何从 COM 类继承的属性或方法,必须重写所有其他继承的属性和方法。
- 不能重写使用 ByRef 参数的属性。
参考:
http://www.cnblogs.com/tonyjoule/archive/2004/05/14/9502.html

浙公网安备 33010602011771号