抽象クラスを使ってメソッド再利用・Javaソースコードの書き方

抽象クラスを使ってメソッドを再利用

樹形図

継承のイメージ画像

抽象クラスは、「メソッドの宣言」と「メソッドの実装」を持つクラスです。
抽象クラスは、抽象クラスを継承する(再利用する)クラスに対して、「メソッド宣言」の実装を義務付けつつ、抽象クラスが既に持つメソッドの再利用を許しているクラスだと思います。

この抽象クラスを継承することによって、メソッドを再利用できます。

抽象クラスの例

以下、抽象クラスの例を書きます。プログラムの詳細を理解する必要は、ありません。

public abstract class AbstractOpenAction extends Action {

    //あるファイルを開くメソッドの宣言
    public abstract ActionForward open(ActionMapping mapping, OpenForm form,
    HttpServletRequest request, HttpServletResponse response);

    public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response){

        ……

        //あるファイルを開くメソッドを、呼び出します。
        this.open(mapping, openForm, request, response);

        ……
    }

    ……

}

この AbstractOpenAction 抽象クラスの「メソッドの宣言」は、open( … ) です。
抽象クラスを継承するクラスにおいて、プログラムの記述によって実装される事を期待している「メソッドの宣言」です。

ちなみにexecute( … ) は、「メソッドの実装」です。既に実装されているので――プログラムコードがあるので――abstract(抽象)とは無関係です。

抽象クラスを再利用するクラスの例

以下、抽象クラスを再利用するクラスの例を書きます。プログラムの詳細を理解する必要は、ありません。

public class TimesheetOpenAction extends AbstractOpenAction {

    public ActionForward open(ActionMapping mapping, OpenForm form,
    HttpServletRequest request, HttpServletResponse response) {

        //タイムシートファイルを開く処理
        ServletContext context = super.getServlet().getServletContext();
        XmlTimesheetManager timesheetManager = 
            (XmlTimesheetManager)context.getAttribute("timesheetManager");

        ……

    }

    ……
    
    //ここで、AbstractOpenActionクラスのexecute(…)を継承し、再利用します。

}

TimesheetOpenAction クラスは、open( … ) という「メソッドの実装」を持っています。
この「メソッドの実装」は、AbstractOpenAction 抽象クラスの「メソッドの宣言」 open( … ) を、実装しています。

TimesheetOpenAction クラスで実装したメソッドの部分は、
//タイムシートファイルを開く処理
ServletContext context = super.getServlet().getServletContext();
……
のプログラムコードです。

別のクラスの例

以下、抽象クラスを再利用するクラスの「別の例」を、書きます。プログラムの詳細を理解する必要は、ありません。

public class RecordOpenAction extends AbstractOpenAction {

    public ActionForward open(ActionMapping mapping, OpenForm form,
    HttpServletRequest request, HttpServletResponse response) {
        
        //就業記録表を開く処理
        ServletContext context = super.getServlet().getServletContext();
        XmlRecordManager recordManager = 
            (XmlTimesheetManager)context.getAttribute("timesheetManager");

        ……

    }

    ……
    
    //ここで、AbstractOpenActionクラスのexecute(…)を継承し、再利用します。

}

RecordOpenAction クラスは、open( … ) という「メソッドの実装」を持っています。
この「メソッドの実装」は、AbstractOpenAction 抽象クラスの「メソッドの宣言」 open( … ) を、実装しています。

RecordOpenAction クラスで実装したメソッドの部分は、以下の部分です。
//就業記録表を開く処理
ServletContext context = super.getServlet().getServletContext();
……

execute( … ) メソッドの再利用

TimesheetOpenAction クラスと RecordOpenAction クラスを比較すると、
open( … )メソッドの宣言」は同じですが、「open( … ) メソッドの実装」は違います。
「タイムシートファイルを開く処理」と「就業記録表を開く処理」のプログラムコードは、違います。

よってAbstractOpenAction 抽象クラスは、
TimesheetOpenAction クラスと RecordOpenAction クラスに対して、
「メソッドの宣言」open( … ) の実装を義務付けつつ、
AbstractOpenAction クラスの execute( … )  メソッドの再利用を許しているクラスと言えます。

※この記事は、2004年9月当時の記事になります。