マネージ COBOL での演算子のオーバーロード

演算子をオーバーロードして、代替動作やさまざまなオペランド タイプに対する動作を提供できます。たとえば、Timer タイプを時間と分で表現する場合、2 つの Timer を追加する 1 つの + (プラス) 演算子と、分を Timer タイプに追加するもう 1 つの + (プラス) 演算子を次のように定義できます。

       operator-id + . 
       01 sumMins binary-long.
       01 sumHour binary-long.
       01 m binary-long value 0.
       01 h binary-long value 0.
       procedure division using value a as type Timer 
                                      b as type Timer 
                            returning c as type Timer.
           set sumHour to a::pHour + b::pHour
           set sumMins to a::pMins + b::pMins
           if sumMins >= 60 
               divide sumMins by 60 giving h remainder m
               set c to new Timer(sumHour + h, m)
           else
               set c to new Timer(sumHour sumMins)
           end-if
       end operator.
       
       operator-id + . 
       01 sumMins binary-long.
       01 m binary-long value 0.
       01 h binary-long value 0.
       procedure division using value a as type Timer 
                                      b as binary-long 
                            returning c as type Timer.
           set sumMins to a::pMins + b
           divide sumMins by 60 giving h remainder m
           set c to new Timer(a::pHour + h , m)
       end operator.

オーバーロードされた演算子を使用するには、次のような文を使用します。

       program-id OpConversionExtension.
       01 timer1 type Timer value new Timer(1 45).
       01 timer2 type Timer value new Timer(2 45).
       01 timer3 type Timer value new Timer.
       01 myMins binary-long value 30.
              
       procedure division.
      *> Overloaded operators:       
           set timer3 to timer1 + myMins   *> Plus operator adds binary-long to a Timer
           display timer3::pHour & ":" & timer3::pMins   *> displays 2:15      

           set timer3 to timer1 + timer2   *> Plus operator adds 2 Timer types
           display timer3::pHour & ":" & timer3::pMins   *> displays 4:30
       end program.

適切な演算子は、機能するオペランドのタイプに従って実行されます。署名 (手続き部の USING 句) が一致する演算子が実行されます。2 つの Timer タイプを追加する場合、2 つの Timer タイプを追加する署名の演算子が実行されます。

演算子の署名では、引数が定義された順序で渡される必要があることに注意してください。上記の例では、次のように最初が Timer タイプ、次が binary-long になる必要があります。

       set timer3 to timer1 + myMins
       ...
       operator-id + .
       procedure division using value a as type Timer
                                      b as binary-long  
                            returning c as type Timer.

引数を逆の順序で渡すようにするには、オペランドが演算子の署名の逆の順序になる別の演算子を宣言する必要があります。次に例を示します。

       set timer3 to myMins + timer1 
       ...
       operator-id + .
       procedure division using value a as binary-long 
                                      b as type Timer 
                            returning c as type Timer.

加減乗除の算術演算子はすべてオーバーロードできますが、それらに相当する動詞はオーバーロードできません。たとえば、次の文の ADD はオーバーロードできません。

       add a to b giving c 

その他の例

演算子のオーバーロードのサンプルも参照してください。このサンプルは、[スタート > すべてのプログラム > Micro Focus Visual COBOL > Samples > Visual COBOL Samples] の COBOL for JVM の下にあります。