次の方法で共有


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

オーバーロードと ParamArray

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

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

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

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

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

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

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

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

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

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

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

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

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 (Visual Basic) パラメーターを持つプロシージャが、パラメーター配列に渡される内容によって異なる無限の数のオーバーロードを持つと見なします。次に示すのは、それらのオーバーロードを大別したものです。

  • 呼び出し元のコードが 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)

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

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

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

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

参照

Overloads (Visual Basic)

概念

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

プロシージャのパラメーターと引数 (Visual Basic)

オーバーロードの解決法 (Visual Basic)