次の方法で共有


オーバーロードされたプロパティとメソッド (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 キーワードを省略すると、オーバーロードは 名前によるシャドウと呼ばれます。 名前によるシャドウは、メンバーの継承された実装を置き換え、派生クラスとその指定されたクラスのインスタンスに対して他のすべてのオーバーロードを使用できなくなります。

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

次の例では、ドル額の 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" というメッセージで呼び出されます。 税金は $5.12" と表示されます。 TaxAmount は、2 回目に Decimal 値を指定して呼び出され、"Price is a Decimal. 税金は $5.12" と表示されます。

こちらも参照ください