次の方法で共有


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

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

Sub プロシージャを使用してFunction プロシージャをオーバーロードできます。また、異なるシグネチャがある場合は、その逆も同様です。 2 つのオーバーロードは、一方が戻り値を持ち、もう一方が戻り値を持たないという点でのみ異なることはできません。

プロシージャをオーバーロードするのと同じ方法で、同じ制限を持つプロパティをオーバーロードできます。 ただし、プロシージャをプロパティでオーバーロードしたり、その逆を行ったりすることはできません。

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

オーバーロードされたバージョンに代わるものがあります。特に、引数の存在が省略可能であるか、その数が可変の場合です。

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

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

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

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

次の場合は、オーバーロードされた一連のバージョンを定義することを検討できます。

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

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

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

次の場合は、1 つ以上の省略可能なパラメーターを使用できます。

  • 呼び出し元のコードが省略可能な引数を指定しない場合に必要なアクションは、パラメーターを既定値に設定することだけです。 このような場合、1 つ以上の Optional パラメーターを使用して単一バージョンを定義すると、プロシージャ コードの複雑度が低下する可能性があります。

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

オーバーロードと ParamArrays

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

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

次の場合は、オーバーロードされた一連のバージョンを定義することを検討できます。

  • 呼び出し元のコードは、パラメーター配列に少数の値を渡すことはありません。

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

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

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

次の場合は、 ParamArray パラメーターを使用することをお勧めします。

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

  • プロシージャ ロジックは、呼び出し元のコードが渡すすべての値の反復処理に役立ち、基本的にすべての値に対して同じ操作を実行します。

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

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

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

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 パラメーターを持つプロシージャに無限の数のオーバーロードがあると見なします。これは、次のように、呼び出し元のコードがパラメーター配列に渡す内容で互いに異なります。

  • 呼び出し元のコードが引数を指定しない場合の 1 つのオーバーロード ParamArray

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

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

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

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に設定できます。 その後、パラメーターのデータ型を宣言する必要はありません。 ただし、この方法には、オーバーロードと比較して次のような欠点があります。

  • 型指定なしのプログラミングでは、効率の低い実行コードが生成されます。

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

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

こちらも参照ください