プロシージャのオーバーロード
更新 : 2007 年 11 月
プロシージャのオーバーロードとは、名前が同じでパラメータ リストが異なる、複数のバージョンのプロシージャを定義することです。プロシージャをオーバーロードする目的は、互いに密接な関係にある複数のバージョンのプロシージャを、名前で区別せずに定義することにあります。バージョンごとに異なるパラメータ リストを使用することによって、これが可能になります。
オーバーロードの規則
プロシージャをオーバーロードする場合は、次のような規則があります。
同じ名前。オーバーロードされた各バージョンは、同じプロシージャ名を使用する必要があります。
別のシグネチャ。オーバーロードされた各バージョンは、次のうちの少なくとも 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 キーワードを使って、次のように、各パラメータ リストごとにプロシージャのバージョンを定義します。
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
参照
処理手順
方法 : 省略可能なパラメータを受け取るプロシージャをオーバーロードする
方法 : 不特定数のパラメータを受け取るプロシージャをオーバーロードする