オーバーロードされたプロパティとメソッド (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 は、指定されたパラメーターのデータ型に基づいて正しいプロシージャを呼び出します。

オーバーロードのルール

オーバーロードされたメンバーをクラスに作成するには、同じ名前を持つ 2 つ以上のプロパティまたはメソッドを追加します。 オーバーロードされた派生メンバーを除き、オーバーロードされた各メンバーは異なるパラメーター リストを持つ必要があります。また、プロパティまたはプロシージャをオーバーロードするときに、区別するための特性として次の項目を使用することはできません。

  • メンバーまたはメンバーのパラメーターに適用される、ByValByRef などの修飾子。

  • パラメーターの名前

  • プロシージャの戻り値の型

Overloads キーワードはオーバーロード時には省略可能ですが、オーバーロードされたメンバーが Overloads キーワードを使用している場合は、同じ名前の他のすべてのオーバーロードされたメンバーにもこのキーワードを指定する必要があります。

派生クラスでは、継承されたメンバーを同じパラメーターとパラメーターの型を持つメンバーでオーバーロードすることができます。これは、名前とシグネチャによるシャドウと呼ばれる処理です。 名前とシグネチャによるシャドウを行うときに Overloads キーワードを使用すると、基底クラスの実装ではなく、派生クラスのメンバーの実装が使用され、そのメンバーの他のすべてのオーバーロードが派生クラスのインスタンスで使用できるようになります。

同じパラメーターとパラメーターの型を持つメンバーで継承されたメンバーをオーバーロードするときに Overloads キーワードを省略した場合、そのオーバーロードは名前によるシャドウと呼ばれます。 名前によるシャドウでは、メンバーの継承された実装が置き換えられます。これにより、派生クラスとその子孫のインスタンスで他のすべてのオーバーロードが使用できなくなります。

OverloadsShadows の両方の修飾子を同じプロパティまたはメソッドで使用することはできません。

次の例では、String または Decimal で表現されたドル額を受け取り、売上税を含む文字列を返すオーバーロードされたメソッドを作成しています。

この例を使用して、オーバーロードされたメソッドを作成するには

  1. 新しいプロジェクトを開いて、TaxClass という名前のクラスを追加します。

  2. 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
    
  3. 次のプロシージャをフォームに追加します。

    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
    
  4. フォームにボタンを追加し、ボタンの Button1_Click イベントから ShowTax プロシージャが呼び出されるようにします。

  5. プロジェクトを実行し、フォームのボタンをクリックして、オーバーロードされた ShowTax プロシージャをテストします。

実行時に、コンパイラは、使用されているパラメーターに一致するオーバーロードされた適切な関数を選択します。 このボタンをクリックすると、最初に、文字列である Price パラメーターを使用して、オーバーロードされたメソッドが呼び出され、"Price is a String. Tax is $5.12" というメッセージが表示されます。 2 回目は、Decimal 値を使用して TaxAmount が呼び出され、"Price is a Decimal. Tax is $5.12" というメッセージが表示されます。

関連項目