チュートリアル: COM オブジェクトによる継承の実装 (Visual Basic)
COM オブジェクト内の Public クラス (以前のバージョンの Visual Basic で作成されたクラスも含む) から Visual Basic クラスを派生できます。COM オブジェクトから継承されたクラスのプロパティとメソッドは、その他の基本クラスのプロパティとメソッドをオーバーライドまたはオーバーロードするのと同じ方法で、オーバーライドまたはオーバーロードできます。COM オブジェクトからの継承は、再コンパイルしない既存のクラス ライブラリがあるときに利用すると便利です。
次の手順では、Visual Basic 6.0 を使用してクラスを含む COM オブジェクトを作成し、作成した 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
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( 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 相互運用性 (Visual Basic)」を参照してください。
相互運用アセンブリ
次の手順では、相互運用機能アセンブリを作成します。相互運用機能アセンブリは、アンマネージ コード (COM オブジェクトなど) と、Visual Studio が使用するマネージ コードの仲介役として機能します。Visual Basic によって作成される相互運用機能アセンブリは、相互運用マーシャリングなど、COM オブジェクトの操作で発生する数多くの詳細な作業を処理します。相互運用マーシャリングとは、COM オブジェクトとの間の変換のときに、パラメーターと戻り値を対応するデータ型にパッケージ化する処理です。Visual Basic アプリケーション内の参照は、実際の COM オブジェクトではなく、相互運用機能アセンブリを指します。
Visual Basic 2005 以降のバージョンで COM オブジェクトを使用するには
新しい Visual Basic Windows アプリケーション プロジェクトを開きます。
[プロジェクト] メニューの [参照の追加] をクリックします。
[参照の追加] ダイアログ ボックスが表示されます。
[COM] タブの [コンポーネント名] ボックスの一覧の ComObject1 をダブルクリックし、[OK] をクリックします。
[プロジェクト] メニューの [新しい項目の追加] をクリックします。
[新しい項目の追加] ダイアログ ボックスが表示されます。
テンプレート ペインの [クラス] をクリックします。
既定のファイル名 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 キーを押してプロジェクトを実行します。
フォーム上のボタンをクリックすると、Short 型の数値を使用して AddNumbers メソッドが呼び出され、Visual Basic によって基本クラスの適切なメソッドが選択されます。AddNumbers の 2 回目の呼び出しは MathClass のオーバーロード メソッドに渡されます。3 回目の呼び出しでは SubtractNumbers メソッドが呼び出され、クラスが拡張されます。基本クラス内のプロパティが設定され、値が表示されます。
次の手順
オーバーロードされた AddNumbers 関数は、COM オブジェクトの基本クラスから継承されたメソッドと同じデータ型を持つように見えます。これは、基本クラスのメソッドの引数とパラメーターが Visual Basic 6.0 では 16 ビットの整数として定義されているのに対し、以降のバージョンでは Short 型の 16 ビットの整数として公開されるためです。新しい関数は、32 ビットの整数を受け取り、基本クラスの関数をオーバーロードします。
COM オブジェクトを操作するときは、パラメーターのサイズとデータ型を必ず確認してください。たとえば、Visual Basic 6.0 のコレクション オブジェクトを引数として受け取る COM オブジェクトを使用するときは、以降のバージョンの Visual Basic のコレクションを提供できません。
COM クラスから継承されたプロパティとメソッドをオーバーライドできます。これは、COM の基本クラスから継承されたプロパティやメソッドを置き換えるローカルのプロパティやメソッドを宣言できることを意味します。継承された COM プロパティをオーバーライドする場合の規則は、その他のプロパティやメソッドをオーバーライドする場合の規則と同じですが、次の例外もあります。
COM クラスから継承されたプロパティやメソッドをオーバーライドする場合は、その他の継承されたプロパティとメソッドをすべてオーバーライドする必要があります。
ByRef パラメーターを使用するプロパティをオーバーライドできません。