プロシージャのオーバーロード (Visual Basic)

プロシージャの "オーバーロード" は、同じ名前と異なるパラメーター リストを使用して、複数のバージョンでプロシージャを定義することを意味します。 オーバーロードの目的は、名前で区別する必要なく、プロシージャの密接に関連する複数のバージョンを定義することです。 これを行うには、異なるパラメーター リストを使用します。

オーバーロードのルール

プロシージャをオーバーロードするときは、次のルールが適用されます。

  • 同じ名前: 各オーバーロードされたバージョンでは、同じプロシージャ名を使用する必要があります。

  • 異なるシグネチャ: 各オーバーロードされたバージョンは、次の項目の少なくとも 1 つが、他のすべてのオーバーロードされたバージョンと異なる必要があります。

    • パラメーターの数

    • パラメーターの順序

    • パラメーターのデータ型

    • 型パラメーターの数 (ジェネリック プロシージャの場合)

    • 戻り値の型 (変換演算子の場合のみ)

    プロシージャ名と組み合わされた上記の項目を総称して、プロシージャの "シグネチャ" と呼びます。 オーバーロードされたプロシージャを呼び出すと、コンパイラはシグネチャを使用して、その呼び出しが定義と正しく一致することを確認します。

  • シグネチャに含まれない項目: シグネチャを変えずにプロシージャをオーバーロードすることはできません。 具体的には、次の 1 つ以上の項目が異なるだけでは、プロシージャをオーバーロードすることはできません。

    • プロシージャ修飾子キーワード (PublicSharedStatic など)

    • パラメーター名または型パラメーター名

    • 型パラメーターの制約 (ジェネリック プロシージャの場合)

    • パラメーター修飾子キーワード (ByRefOptional など)

    • 値を返すかどうか

    • 戻り値のデータ型 (変換演算子を除く)

    上記の一覧の項目は、シグネチャには含まれません。 これらを使用してオーバーロードされたバージョンを区別することはできませんが、シグネチャによって適切に区別されているオーバーロードされたバージョン間でこれらを変えることは可能です。

  • 遅延バインディングされた引数: 遅延バインディングされたオブジェクト変数をオーバーロードされたバージョンに渡す場合は、適切なパラメーターを Object として宣言する必要があります。

プロシージャの複数のバージョン

顧客の残高に対してトランザクションを転記する Sub プロシージャを作成し、名前または口座番号で顧客を参照できるようにするとします。 これに対応するために、次の例のように、2 つの異なる Sub プロシージャを定義できます。

Sub postName(ByVal custName As String, ByVal amount As Single)
    ' Insert code to access customer record by customer name.
End Sub
Sub postAcct(ByVal custAcct As Integer, ByVal amount As Single)
    ' Insert code to access customer record by account number.
End Sub

オーバーロードされたバージョン

別の方法として、単一のプロシージャ名をオーバーロードします。 次のように、Overloads キーワードを使用して、パラメーター リストごとにプロシージャのバージョンを定義できます。

Overloads Sub post(ByVal custName As String, ByVal amount As Single)
    ' Insert code to access customer record by customer name.
End Sub
Overloads Sub post(ByVal custAcct As Integer, ByVal amount As Single)
    ' Insert code to access customer record by account number.
End Sub

追加のオーバーロード

取引金額を Decimal または Single で受け入れることも必要な場合は、post をさらにオーバーロードしてこのバリエーションに対応できます。 前の例の各オーバーロードに対してこれを行う場合、すべて同じ名前で 4 つの異なるシグネチャを持つ 4 つの Sub プロシージャを作成します。

オーバーロードの利点

プロシージャをオーバーロードする利点は、呼び出しの柔軟性にあります。 前の例で宣言された post プロシージャを使用する場合、呼び出し元のコードで String または Integer として顧客 ID を取得し、どちらの場合も同じプロシージャを呼び出すことができます。 次に例を示します。

Imports MSVB = Microsoft.VisualBasic
Dim customer As String
Dim accountNum As Integer
Dim amount As Single
customer = MSVB.Interaction.InputBox("Enter customer name or number")
amount = MSVB.Interaction.InputBox("Enter transaction amount")
Try
    accountNum = CInt(customer)
    Call post(accountNum, amount)
Catch
    Call post(customer, amount)
End Try

関連項目