【Java】オーバーライドの実用的な使い方の一例を解説する

※JAVAを例に解説していますが、C#とかでも考え方は同じです。

オーバーライドの実用的な使い方の一例を解説する

オーバーライドとは

簡単に言うと、スーパークラスで定義されているメソッドをサブクラスにて同じメソッド名で定義することでスーパークラスのメソッドを上書きできる。ということですね。

ただ、筆者がエンジニア駆け出しの頃、この説明だけ聞いてもどうやって使用すればいいのかわかりませんでした。

と。

そんなわけで今回は現場でもよく見られるオーバーライドの使い方実例を解説していきたいと思います。

今回使用した環境

インターネット接続可能のオンラインの環境

64 ビット オペレーティング システム

Windows 10 22H2

Java 17

解説

オーバーライドをするにはスーパークラス、サブクラスが必要となってきます。

ここではスーバークラスをBasicCurryクラス ( 基本的なカレークラス ) とします。以下ソースです。

public class BasicCurry {
    
    // カレー作り開始! Start cooking!
    protected void startCooking() {
        displayTitle();
        cut();
        stirFry();
        stew();
        customize();
    }
    protected void displayTitle() {
        System.out.println("■基本的なカレーの作り方");
    }
    protected void cut() {
        System.out.println("・じゃがいも、にんじん、たまねぎを切る");
    }
    protected void stirFry() {
        System.out.println("・肉、野菜を炒める");
    }
    protected void stew() {
        System.out.println("・鍋で煮込む");
    }
    protected void customize() {
        // サブクラス側で自由に定義
    }
}

これが現場でもよく見られる例でstartCookingという一連の処理の流れがあり、そこから呼び出されている各工程のメソッドがオーバーライド可能なメソッドとなっています。

ちなみにstartCookingメソッドの実行結果は以下のようにコンソール出力されます。

■基本的なカレーの作り方
・じゃがいも、にんじん、たまねぎを切る
・肉、野菜を炒める
・鍋で煮込む

次にサブクラスをMyCurryクラス ( オレ流カレークラス ) とします。以下ソースです。

public class MyCurry extends BasicCurry {

    @Override
    protected void displayTitle() {
        System.out.println("■オレ流カレーの作り方");
    }
    @Override
    protected void cut() {
        // 野菜は入れたくないので工程省略
    }
    @Override
    protected void stirFry() {
        System.out.println("・肉だけを焼く");
    }
    @Override
    protected void customize() {
        System.out.println("★できあがったら写真を撮る");
    }
}

BasicCurryクラスのメソッドをオーバーライド ( 自分好みにカスタマイズ ) してMyCurryクラスを作っていますね。

そしてBasicCurry.startCookingメソッドを実行すると以下のようになります。

■オレ流カレーの作り方
・肉だけを焼く
・鍋で煮込む
★できあがったら写真を撮る

スーパークラスのメソッドが上書きされて処理が変わりましたね。

オーバーライドはメソッドの上書きなのですが、上記のMyCurryクラスのように

①cutメソッドでは処理の省略 ( 空のメソッドで上書き )

②stirFryメソッドでは処理の上書き ( メソッドの書き換え )

③customizeメソッドでは処理の追加 ( 元々なかった処理を追加 )

ということができます。オーバーライドの本質はメソッドの上書きなのですが、その中でも3パターンの使い道があることが重要となります。

筆者の今まで見てきた中、現場で使用頻度が高いのは①、③ですね。

①はとある処理だけ省略したい場合によく使います。
 ⇒例:このチェック処理だけ省略したい

③はとある処理を特定の箇所に差し込みたい場合によく使います。
 ⇒例:メイン処理の後に独自の後処理を挿入したい

オーバーライドを使用することのメリット

メリットとして言いたいことはBasicCurryクラス内にif文がひとつもないことがポイントです。

BasicCurryクラス内で「オレの場合は…こうする!」と自分勝手なif文を作ってしまうとBasicCurryクラスは汎用性を持たせた基本的なカレークラスであるべきなのに、自己流カスタマイズが入ってしまうこととなります。

BasicCurry内に自分勝手なif文をどんどん作ってしまうと、「汎用性の意味がなくなる」、「プログラム修正をするときにクラス単位で製造担当者を分けることができない」等、いろいろな弊害が出てきます。

デメリットはあまりないような気がしますが、あえて言うとすると、オーバーライドを見慣れていない人にとっては何をしているのかわかりづらい。という点でしょうか。


以上となります。

ここまでお読みいただきありがとうございました。

Java

Posted by だゆう