オーバーロードされたプロパティとメソッド (Visual Basic)
オーバーロードとは、異なる型の引数を持つ同じ名前のプロシージャ、インスタンス コンストラクター、またはプロパティをクラスに複数作成することです。
オーバーロードの使用方法
別のデータ型を処理するプロシージャに同じ名前を付けるオブジェクト モデルを使用している場合は、特にオーバーロードが有効です。 たとえば、複数のデータ型を表示できるクラスの Display プロシージャは、次のようになります。
Overloads Sub Display(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
Overloads Sub Display(ByVal theDouble As Double)
' Add code that displays Double data.
End Sub
オーバーロードを利用しない場合は、各プロシージャの動作が同じであっても、次のようにそれぞれに別の名前を付ける必要があります。
Sub DisplayChar(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Sub DisplayInt(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
Sub DisplayDouble(ByVal theDouble As Double)
' Add code that displays Double data.
End Sub
オーバーロードを利用すると、使用するデータ型を選択できるようになるため、プロパティやメソッドの使い方が簡単になります。 たとえば、上のオーバーロードされた Display メソッドを呼び出すには、以下のどのコード行でも使用できます。
' Call Display with a literal of type Char.
Display("9"c)
' Call Display with a literal of type Integer.
Display(9)
' Call Display with a literal of type Double.
Display(9.9R)
実行時には、指定したパラメーターのデータ型に基づき、Visual Basic によって正しいプロシージャが呼び出されます。
オーバーロードの規則
オーバーロードされたクラスのメンバーを作成するには、同じ名前を持つ複数のプロパティまたはメソッドを追加します。 オーバーロードされた派生メンバーを除き、オーバーロードされた各メンバーは、それぞれパラメーター リストが異なっている必要があります。また、プロパティやプロシージャをオーバーロードするときには、以下の項目でそれぞれを区別することはできません。
メンバーに適用される ByVal や ByRef などの修飾子、またはメンバーのパラメーター
パラメーターの名前
プロシージャの戻り値の型
オーバーロードを行うときに Overloads キーワードは省略可能ですが、オーバーロードされるメンバーのいずれかで Overloads キーワードを使用する場合には、同じ名前を持つ他のすべてのオーバーロードされるメンバーにもこのキーワードを指定する必要があります。
派生クラスは、継承したメンバーを同じパラメーター (および同じパラメーター型) を持つメンバーでオーバーロードできます。これは名前とシグネチャによるシャドウと呼ばれます。 名前とシグネチャによるシャドウで Overloads キーワードを使用した場合は、基本クラス内の実装の代わりにメンバーの派生クラスの実装が使用され、そのメンバーに対する他のすべてのオーバーロードが派生クラスのインスタンスで使用できるようになります。
継承したメンバーを同じパラメーター (および同じパラメーター型) を持つメンバーでオーバーロードするときに Overloads キーワードを省略した場合、そのオーバーロードは名前によるシャドウと呼ばれます。 名前によるシャドウを行うと、メンバーの継承した実装が置き換わります。派生クラスのインスタンスとその子孫は、他のすべてのオーバーロードを使用できなくなります。
Overloads 修飾子と Shadows 修飾子の両方を同じプロパティまたはメソッドで使用することはできません。
例
次の例で作成するオーバーロードされたメソッドは、金額を String または Decimal の値として受け取って、消費税を加えた額を文字列として返します。
この例を使ってオーバーロードされたメソッドを作成するには
新しいプロジェクトを開き、TaxClass という名前のクラスを追加します。
TaxClass クラスに次のコードを追加します。
Public Class TaxClass Overloads Function TaxAmount(ByVal decPrice As Decimal, ByVal TaxRate As Single) As String TaxAmount = "Price is a Decimal. Tax is $" & (CStr(decPrice * TaxRate)) End Function Overloads Function TaxAmount(ByVal strPrice As String, ByVal TaxRate As Single) As String TaxAmount = "Price is a String. Tax is $" & CStr((CDec(strPrice) * TaxRate)) End Function End Class
フォームに次のプロシージャを追加します。
Sub ShowTax() ' 8% tax rate. Const TaxRate As Single = 0.08 ' $64.00 Purchase as a String. Dim strPrice As String = "64.00" ' $64.00 Purchase as a Decimal. Dim decPrice As Decimal = 64 Dim aclass As New TaxClass 'Call the same method with two different kinds of data. MsgBox(aclass.TaxAmount(strPrice, TaxRate)) MsgBox(aclass.TaxAmount(decPrice, TaxRate)) End Sub
フォームにボタンを追加し、ボタンの Button1_Click イベントから ShowTax プロシージャを呼び出します。
プロジェクトを実行し、フォームのボタンをクリックして、オーバーロードされた ShowTax プロシージャをテストします。
実行時には、使用されているパラメーターに対応する適切な関数がコンパイラによって選択されます。 ボタンをクリックすると、オーバーロードされたメソッドがまず文字列の Price パラメーターで呼び出され、"Price is a String. Tax is $5.12" というメッセージが表示されます。 次に、Decimal 値と共に TaxAmount が呼び出され、"Price is a Decimal. Tax is $5.12" というメッセージが表示されます。