Share via


プロシージャのオーバーロードに関する注意事項

更新 : 2007 年 11 月

プロシージャをオーバーロードする場合、オーバーロードされる各バージョンに別々のシグネチャを使用する必要があります。通常は、各バージョンに別々のパラメータ リストを指定します。詳細については、「プロシージャのオーバーロード」の「別のシグネチャ」を参照してください。

シグネチャが異なる場合は、Function プロシージャと Sub プロシージャとの間のオーバーロードも可能です。戻り値を持つか持たないかという点だけが異なる 2 つのオーバーロードが共存することはできません。

プロパティは、プロシージャと同じようにオーバーロードでき、同じ制約を受けます。ただし、プロシージャによるプロパティのオーバーロード、またはその逆のオーバーロードを行うことはできません。

オーバーロードされたバージョンの代替手段

特に、引数が省略可能な場合や引数の数が可変である場合、オーバーロードされたバージョンの代替手段を利用できる場合があります。

ただし、省略可能な引数はすべての言語でサポートされているとは限りません。また、パラメータの配列は Visual Basic のみに限定されています。他のいくつかの言語で書かれているコードから呼び出されるプロシージャを作成する場合、オーバーロードされたバージョンによって柔軟性が向上します。

オーバーロードと省略可能な引数

呼び出し元のコードが 1 つ以上の引数を指定または省略できる場合は、複数のオーバーロードされたバージョンを定義するか、省略可能なパラメータを使用できます。

オーバーロードされたバージョンを使用する場合

オーバーロードされたバージョンを定義するのは、次のような場合です。

  • 呼び出し元のコードが省略可能な引数を使用するかどうかによって、プロシージャ コード内のロジックが大きく異なる

  • プロシージャのコードが、呼び出し元のコードが省略可能な引数を使っているかどうかを確認する有効な手段がないこれは、呼び出し元のコードからの提供が期待できない引数に、既定値として使用できる値がない場合などです。

省略可能なパラメータを使用する場合

1 つ以上の省略可能なパラメータを使用すると有効なのは、次のような場合です。

  • 呼び出し元のコードが省略可能な引数を使用していない場合に、パラメータを既定値に設定するこの場合、1 つ以上の Optional パラメータで 1 つのバージョンを定義すると、プロシージャのコードを単純化できます。

詳細については、「省略可能なパラメータ」を参照してください。

オーバーロードと ParamArray

呼び出し元のコードが使用する引数の数が可変の場合、複数のオーバーロードされたバージョンを定義するか、パラメータの配列を使用します。

オーバーロードされたバージョンを使用する場合

オーバーロードされたバージョンを定義するのは、次のような場合です。

  • 呼び出し元のコードがパラメータの配列に格納する値の数が、少ないことが明らかな場合

  • プロシージャのコード内のロジックが、呼び出し元のコードから提供される値の数によって大きく異なる

  • 呼び出し元のコードから、データ型の異なる値が提供されることがある

パラメータの配列を使用する場合

次の場合は、ParamArray を使用するのが適しています。

  • 呼び出し元のコードからパラメータの配列に提供される値の数が予測できず、多数になる可能性がある場合

  • プロシージャのロジックが、呼び出し元のコードから提供されたすべての値を反復処理し、すべての値にほぼ同じ操作を行う場合

詳細については、「パラメータ配列」を参照してください。

省略可能なパラメータの暗黙のオーバーロード

Optional (Visual Basic) パラメータを持つプロシージャは、省略可能なパラメータを持つバージョンと持たないバージョンの 2 つのオーバーロードされたプロシージャと同じです。このようなプロシージャは、これらのいずれかに対応するパラメータのリストではオーバーロードできません。これを表す宣言を次に示します。

Overloads Sub q(ByVal b As Byte, Optional ByVal j As Long = 6)
' The preceding definition is equivalent to the following two overloads.
' Overloads Sub q(ByVal b As Byte)
' Overloads Sub q(ByVal b As Byte, ByVal j As Long)
' Therefore, the following overload is not valid because the signature is already in use.
' Overloads Sub q(ByVal c As Byte, ByVal k As Long)
' The following overload uses a different signature and is valid.
Overloads Sub q(ByVal b As Byte, ByVal j As Long, ByVal s As Single)

省略可能なパラメータが複数あるプロシージャでは、上の例と同様の理由で、暗黙のオーバーロードがいくつかあることになります。

パラメータ ParamArray の暗黙のオーバーロード

コンパイラは、ParamArray パラメータを持つプロシージャが、パラメータ配列に渡される内容によって異なる無限の数のオーバーロードを持つと見なします。次に示すのは、それらのオーバーロードを大別したものです。

  • 呼び出し元のコードが ParamArray に引数を渡さない場合のオーバーロード

  • 呼び出し元のコードが ParamArray 要素型の 1 次元配列を渡す場合のオーバーロード

  • 呼び出し元のコードが ParamArray 要素型の引数をその数だけ渡す場合のオーバーロード (すべての正の整数に対して 1 つ)

次の宣言は、これらの暗黙のオーバーロードを示しています。

Overloads Sub p(ByVal d As Date, ByVal ParamArray c() As Char)
' The preceding definition is equivalent to the following overloads.
' Overloads Sub p(ByVal d As Date)
' Overloads Sub p(ByVal d As Date, ByVal c() As Char)
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char)
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char, ByVal c2 As Char)
' And so on, with an additional Char argument in each successive overload.

このようなプロシージャは、パラメータ配列として 1 次元配列を受け取るパラメータ リストではオーバーロードできません。ただし、他の暗黙のオーバーロードのシグネチャは使用できます。次の宣言はこのことを示しています。

' The following overload is not valid because it takes an array for the parameter array.
' Overloads Sub p(ByVal x As Date, ByVal y() As Char)
' The following overload takes a single value for the parameter array and is valid.
Overloads Sub p(ByVal z As Date, ByVal w As Char)

オーバーロードの代わりとしての型宣言を省略したプログラミング

呼び出し元のコードが、パラメータに異なるデータ型を渡せるようにするには、Visual Basic での型宣言を省略したプログラミングというアプローチを利用します。Option Strict ステートメントまたは /optionstrict のいずれかのコンパイラ オプションを使用すると、型チェックのスイッチを Off にできます。これで、パラメータのデータ型を宣言する必要がなくなります。ただし、この方法には、オーバーロードとは違って次のような問題があります。

  • 型宣言を省略したプログラミングでは、実行コードが非効率的になります。

  • 渡される可能性があるすべてのデータ型をプロシージャでテストする必要があります。

  • プロシージャがサポートしていないデータ型を呼び出し元のコードが渡しても、コンパイラでエラーが生成されません。

参照

処理手順

プロシージャのトラブルシューティング

方法 : プロシージャの複数のバージョンを定義する

方法 : オーバーロードされたプロシージャを呼び出す

方法 : 省略可能なパラメータを受け取るプロシージャをオーバーロードする

方法 : 不特定数のパラメータを受け取るプロシージャをオーバーロードする

概念

Visual Basic におけるプロシージャ

プロシージャのパラメータと引数

オーバーロードの解決法

参照

Overloads