まず、ターゲット クラスまたはその親クラスのいずれかに存在し、要求された名前を持つすべてのメソッドの完全なセット(同一のシグネチャを持つメソッドを除く)から始めます。このセットから、メソッドにコード化されている可視属性に基づいて、呼び出し側プログラムから見えないメソッドが次のように破棄されます。
属性 |
可視性 |
PRIVATE |
呼び出し側クラスがターゲット クラスと同じ場合にのみ表示される |
PUBLIC |
常に表示される |
PROTECTED |
呼び出し側クラスがターゲット クラスから派生している場合にのみ表示される |
INTERNAL |
ターゲット クラスが呼び出し側クラスと同じアセンブリに含まれている場合にのみ表示される |
PROTECTED INTERNAL |
呼び出し側クラスがターゲット クラスから派生している場合、または呼び出し側クラスがターゲット クラスと同じアセンブリに含まれている場合にのみ表示される |
次に、必要なメソッドがインスタンス メソッド(オブジェクト インスタンスに適用されるメソッド)である場合は、すべての静的メソッドが破棄されます。同様に、必要なメソッドが静的メソッドである場合は、すべてのインスタンス メソッドが破棄されます。
ここで、各メソッドが順番に検査され、標準形式で適用可能かどうか確認されます。この判別は次のように行われます。
- 引数の数がメソッド内のパラメータの数と異なる場合、そのメソッドは破棄されます。
- ターゲット メソッド内のパラメータの型が MicroFocus.COBOL.Program.Reference(参照により渡される一般的な COBOL データ)である場合、引数の型は一致すると見なされます(.NET ネイティブ型を除く)。
- 各引数で明示的なパラメータ受け渡し方式(BY CONTENT、BY VALUE、または BY OUTPUT)が指定されている場合、その受け渡し方式が検査対象のメソッド内のパラメータの定義と対応している必要があります。
-
REFERENCE パラメータまたは OUTPUT パラメータについては、引数の型がパラメータの型と完全に一致している必要があります。
VALUE パラメータについては、引数の型から対応するパラメータの型への暗黙的な変換が存在する必要があります。これらの暗黙的な変換のいずれかで切り捨てが必要な場合、そのメソッドは「切り捨て一致」と考えられます。「暗黙的な変換」を参照してください。
これらの規則に基づいてメソッドが適用不可と判別された場合は、次の両方の条件を満たしているときに限り、拡張形式のメソッドとの照合が試みられます。
- メソッドの最後のパラメータが 'params' 属性を持つ配列である
- メソッド パラメータの合計数(この配列パラメータを除く)が引数の数以下である
メソッドの拡張形式は、標準形式から派生した形式です。この場合、パラメータの合計数が呼び出し側の引数の数と同じになるように、配列要素と同じ型を持つ 0 個以上の値パラメータで配列パラメータが置き換えられます。同じ拡張シグネチャを持つ標準形式のメソッドがクラスにすでに存在する場合、そのメソッドは適用不可と判別されます。それ以外の場合は、上記の標準形式の検査と同様の方法で、拡張形式の適用性が検査されます。
上記の選択手順の後、次のように処理されます。
- 適用可能なメソッドが見つからなかった場合は、コンパイラからエラー(「メソッドが見つからない」)が返されます。
- 見つかった一致が切り捨て一致のみの場合、見つかったのが 1 件だけであればそのメソッドが選択され、警告が生成されます。複数の切り捨て一致が見つかった場合は、一致があいまいであることを示すエラーが返されます。
- 切り捨て一致以外が見つかった場合は、すべての切り捨て一致が破棄されます。
- 適用可能なメソッドが 1 つだけ見つかった場合は、そのメソッドが必要なメソッドとして認識されます。
- 適用可能なメソッドが複数見つかった場合は、最良のメソッドを見つけようと試みられます。「適用可能な複数のメソッドからの選択」を参照してください。