次の方法で共有


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

プロシージャをオーバーロードするときは、オーバーロードされたバージョンごとに異なる "シグネチャ" を使用する必要があります。 通常、これはバージョンごとに異なるパラメーター リストを指定する必要があることを意味します。 詳細については、「プロシージャのオーバーロード」の「異なるシグネチャ」をご覧ください。

シグネチャが異なるという前提で、Function プロシージャを Sub プロシージャでオーバーロードすることができ、その逆も可能です。 一方に戻り値があり、もう一方にはないという点だけでは、2 つのオーバーロードが異なると見なすことはできません。

プロパティは、プロシージャをオーバーロードする場合と同じ方法で、同じ制限を適用してオーバーロードすることができます。 ただし、プロパティでプロシージャをオーバーロードすることはできません。その逆も同様です。

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

特に、引数が省略可能である場合やその数が可変である場合は、オーバーロードされたバージョンに代わるものを使用することがあります。

省略可能な引数はすべての言語で必ずしもサポートされているわけではなく、パラメーター配列は Visual Basic に限定されていることに注意してください。 さまざまな言語のいずれかで記述されたコードから呼び出される可能性が高いプロシージャを作成する場合は、オーバーロードされたバージョンが最も優れた柔軟性を提供します。

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

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

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

次の場合は、一連のオーバーロードされたバージョンを定義することを検討してください。

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

  • プロシージャ コードで、呼び出し元のコードが省略可能な引数を指定しているかどうかを確実にテストすることができない場合。 たとえば、呼び出し元のコードが指定することを期待できない既定値の候補が存在しない場合は、これに該当します。

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

次の場合には、1 つ以上の省略可能なパラメーターを使用することをお勧めします。

  • 呼び出し元のコードが省略可能な引数を指定しない場合に必要な唯一のアクションが、パラメーターを既定値に設定することである場合。 このような場合、1 つ以上の Optional パラメーターを持つ単一のバージョンを定義すると、プロシージャー コードの複雑さを軽減できます。

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

オーバーロードと ParamArray

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

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

次の場合は、一連のオーバーロードされたバージョンを定義することを検討してください。

  • 呼び出し元のコードがパラメーター配列に渡す値が常に少数であることがわかっている場合。

  • 呼び出し元のコードが渡す値の数によって、プロシージャ コードのロジックが大きく異なる場合。

  • 呼び出し元のコードがさまざまなデータ型の値を渡すことができる場合。

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

次の場合は、ParamArray パラメーターの方が適しています。

  • 呼び出し元のコードがパラメーター配列に渡すことができる値の数を予測できず、数が多くなる可能性がある場合。

  • プロシージャのロジックが、すべての値に対して基本的に同じ操作を実行するものであり、呼び出し元のコードから渡されるすべての値を反復処理するのに適している場合。

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

Optional パラメーターの暗黙的なオーバーロード

Optional パラメーターを持つプロシージャは、省略可能なパラメーターを持つものと持たないものの 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 に引数を指定しない場合に対応する 1 つのオーバーロード

  • 呼び出し元のコードが ParamArray 要素型の 1 次元配列を指定した場合に対応する 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)

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

呼び出し元のコードがパラメーターにさまざまなデータ型を渡すことができるようにする場合、別の方法として、型宣言を省略したプログラミングがあります。 Option Strict ステートメントまたは -optionstrict コンパイラ オプションで、型チェック スイッチを Off に設定できます。 その後、パラメーターのデータ型を宣言する必要はありません。 ただし、オーバーロードと比較して、この方法には次の欠点があります。

  • 型宣言を省略したプログラミングでは、効率的ではない実行コードが生成されます。

  • プロシージャは、渡されることが予想されるすべてのデータ型をテストする必要があります。

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

関連項目