1. 導入:なぜ抽象メソッドが重要なのか?
大規模なオブジェクト指向開発において、共通のインターフェース設計を強制することは、コードの可読性、保守性、そして拡張性を向上させる上で非常に重要です。特に、親クラスで「どのような処理が必要か」は定義するものの、「具体的な実装方法」は子クラスに任せたい、という場面は少なくありません。このような要求に応えるのが抽象メソッドです。抽象メソッドを用いることで、サブクラスごとに異なる実装を安全に吸収し、開発者間の規約を明確にすることができます。モダンCOBOL(2002年以降)では、この抽象メソッドを効果的に利用することが可能です。
2. 基礎知識:抽象メソッドとは?
抽象メソッド(ABSTRACT METHOD)とは、メソッドのシグネチャ(メソッド名、引数、戻り値の型)のみが定義されており、実際の処理内容は記述されていないメソッドのことです。抽象メソッドを持つクラスは抽象クラスと呼ばれ、インスタンス化することができません。抽象クラスは、そのクラスを継承するサブクラスに対して、「このメソッドを必ず実装してください」という規約を課す役割を果たします。これにより、サブクラスは共通のインターフェースを持ちつつ、それぞれの特性に応じた具体的な処理を実装することができます。
COBOLにおけるメソッドの定義はMETHOD-ID.句で行われ、抽象メソッドとして定義する場合は、その後にIS ABSTRACT.句を追加します。この構文により、コンパイラはそのメソッドが実装を持たない抽象メソッドであることを認識します。
3. 実装:抽象メソッドの定義と利用
抽象メソッドを定義する手順は以下の通りです。
- 抽象クラスの定義:クラス定義の
CLASS-ID.句でクラス名を指定します。 - 抽象メソッドの定義:
METHOD-ID.句でメソッド名を指定し、続けてIS ABSTRACT.句で抽象メソッドであることを示します。 - サブクラスでの実装:抽象クラスを継承するサブクラスで、定義された抽象メソッドをオーバーライドし、具体的な実装を記述します。サブクラスで実装されない場合、コンパイルエラーとなります。
この仕組みにより、親クラスで定義された共通の処理の流れを維持しつつ、各サブクラスの固有のロジックを安全に組み込むことができます。
4. サンプルプログラム:抽象メソッドの実装例
ここでは、形状(Shape)クラスを抽象クラスとし、面積を計算する抽象メソッドCalculateAreaを定義します。そして、円(Circle)クラスと長方形(Rectangle)クラスでこれを継承し、それぞれ具体的な面積計算を実装する例を示します。
IDENTIFICATION DIVISION.
PROGRAM-ID. AbstractMethodExample.
CLASS-ID. Shape AS "Shape".
DATA DIVISION.
WORKING-STORAGE SECTION.
METHOD-ID. CalculateArea IS ABSTRACT.
END CLASS Shape.
CLASS-ID. Circle INHERITS Shape.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CircleRadius PIC 9(5)V9(2) VALUE 10.00.
01 CalculatedArea PIC 9(10)V9(2).
01 PI PIC 9(1)V9(5) VALUE 3.14159.
LINKAGE SECTION.
01 CalculatedAreaOut PIC 9(10)V9(2).
METHOD-ID. CalculateArea.
PROCEDURE DIVISION RETURNING CalculatedAreaOut.
> 円の面積を計算する (π r^2)
COMPUTE CalculatedArea OUT = PI CircleRadius CircleRadius.
MOVE CalculatedArea TO CalculatedAreaOut.
GOBACK.
END METHOD CalculateArea.
END CLASS Circle.
CLASS-ID. Rectangle INHERITS Shape.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 RectangleWidth PIC 9(5) VALUE 20.
01 RectangleHeight PIC 9(5) VALUE 10.
01 CalculatedArea PIC 9(10).
LINKAGE SECTION.
01 CalculatedAreaOut PIC 9(10).
METHOD-ID. CalculateArea.
PROCEDURE DIVISION RETURNING CalculatedAreaOut.
> 長方形の面積を計算する (幅 高さ)
COMPUTE CalculatedArea OUT = RectangleWidth RectangleHeight.
MOVE CalculatedArea TO CalculatedAreaOut.
GOBACK.
END METHOD CalculateArea.
END CLASS Rectangle.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
> Circleオブジェクトを作成
CALL "Circle" "new" RETURNING oCircle.
> CircleのCalculateAreaメソッドを呼び出す
CALL oCircle "CalculateArea" RETURNING cArea.
DISPLAY "Circle Area: " cArea.
> Rectangleオブジェクトを作成
CALL "Rectangle" "new" RETURNING oRectangle.
> RectangleのCalculateAreaメソッドを呼び出す
CALL oRectangle "CalculateArea" RETURNING rArea.
DISPLAY "Rectangle Area: " rArea.
STOP RUN.
END PROGRAM AbstractMethodExample.
5. 応用・注意点
抽象メソッドの活用:抽象メソッドは、デザインパターンにおける「テンプレートメソッドパターン」などを実装する際にも非常に役立ちます。共通の処理フローを親クラスで定義し、その中の特定の手順を抽象メソッドとしてサブクラスに実装させることで、処理全体の柔軟性と再利用性を高めることができます。
注意点:
- 抽象クラスはインスタンス化できない:
Shapeクラスは抽象クラスなので、直接CALL "Shape" "new"のようにしてインスタンスを作成しようとするとエラーになります。 - 実装漏れに注意:サブクラスで抽象メソッドの実装を忘れると、コンパイルエラーとなります。これは、規約違反を防ぐためのCOBOLコンパイラの親切な機能です。
IS ABSTRACT.の記述忘れ:メソッドを抽象メソッドとして定義する際には、IS ABSTRACT.を付け忘れないように注意してください。付け忘れると、実装がない状態でコンパイルが通ってしまい、実行時に予期せぬ問題を引き起こす可能性があります。
モダンCOBOLにおける抽象メソッドの理解と活用は、より堅牢で保守性の高いオブジェクト指向プログラムを開発するための強力な武器となります。ぜひ、日々の開発に取り入れてみてください。

コメント