プロシージャのオーバーロード (Visual Basic)
プロシージャのオーバーロードとは、名前が同じでパラメーター リストが異なる、複数のバージョンのプロシージャを定義することです。プロシージャをオーバーロードする目的は、互いに密接な関係にある複数のバージョンのプロシージャを、名前で区別せずに定義することにあります。バージョンごとに異なるパラメーター リストを使用することによって、これが可能になります。
オーバーロードの規則
プロシージャをオーバーロードする場合は、次のような規則があります。
同じ名前。オーバーロードされた各バージョンは、同じプロシージャ名を使用する必要があります。
別のシグネチャ。オーバーロードされた各バージョンは、次のうちの少なくとも 1 つが他のすべてのバージョンと異なっている必要があります。
パラメーターの数
パラメーターの順序
パラメーターのデータ型
型パラメーターの数 (ジェネリック プロシージャの場合)
戻り値の型 (変換演算子のみ)
プロシージャ名と共に、上記の項目はまとめて、プロシージャのシグネチャと呼ばれます。オーバーロードされたプロシージャを呼び出す場合、コンパイラはシグネチャを使って、呼び出しが定義と一致しているかどうかを確認します。
シグネチャに含まれない項目。プロシージャをオーバーロードするには、シグネチャを変更する必要があります。以下の要素を変更するだけでは、プロシージャをオーバーロードすることはできません。
Public、Shared、Static などのプロシージャ修飾子キーワード
パラメーターまたは型パラメーターの名前
型パラメーターの制約 (ジェネリック プロシージャの場合)
ByRef や Optional などのパラメーター修飾子キーワード
値を返すかどうか
戻り値のデータ型 (変換演算子以外)
上記のリスト項目は、シグネチャの一部ではありません。これらを使って複数のオーバーロードされたバージョンを区別することはできませんが、シグネチャによって適切に差別化されたオーバーロードされたバージョンのそれぞれで、これらの要素が異なっていてもかまいません。
遅延バインディングの引数。遅延バインディング オブジェクト変数をオーバーロードされたバージョンに渡す場合は、適切なパラメーターを 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
オーバーロードされたバージョン
この他に、1 つのプロシージャ名をオーバーロードする方法もあります。Overloads (Visual Basic) キーワードを使って、次のように、各パラメーター リストごとにプロシージャのバージョンを定義します。
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 をさらにオーバーロードします。上の例のオーバーロードされた各バージョンをさらにオーバーロードすると、名前が同じでシグネチャがそれぞれ異なる Sub プロシージャが 4 つできることになります。
オーバーロードの利点
プロシージャのオーバーロードの利点は、呼び出しの柔軟性にあります。上の例で宣言した post プロシージャを使用する場合、呼び出し元のコードでは、顧客の ID を String として取得することも Integer として取得することもできます。いずれの場合も、呼び出すプロシージャは同じです。次に例を示します。
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
参照
処理手順
方法: プロシージャの複数のバージョンを定義する (Visual Basic)
方法: オーバーロードされたプロシージャを呼び出す (Visual Basic)
方法: 省略可能なパラメーターを受け取るプロシージャをオーバーロードする (Visual Basic)
方法: 不特定数のパラメーターを受け取るプロシージャをオーバーロードする (Visual Basic)