オーバーロードされたプロパティとメソッド
更新 : 2007 年 11 月
オーバーロードとは、異なる型の引数を持つ同じ名前のプロシージャ、インスタンス コンストラクタ、またはプロパティをクラスに複数作成することです。
オーバーロードの使用方法
別のデータ型を処理するプロシージャに同じ名前を付けるオブジェクト モデルを使用している場合は、特にオーバーロードが有効です。たとえば、複数のデータ型を表示できるクラスの 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 で呼び出されます。
メモ : |
---|
オーバーロード、オーバーライド、およびシャドウの概念は、似ているためにしばしば混同されます。詳細については、「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" というメッセージが表示されます。