プログラム

継承とは(プログラミング)

2021年8月8日

継承(プログラミング)

継承とは

継承(英:inheritance)とは、オブジェクト指向を構成する概念の一つです。(※オブジェクト指向の3大要素は"継承"、"ポリモーフィズム(多態性)"、"カプセル化")

クラスが持っている機能(変数やメソッド)を他のクラスに引き継がせることを継承といい、継承元のクラスを親クラス(スーパークラス)、継承先のクラスを子クラス(サブクラス)と呼びます。

以下は継承のイメージ例です。

継承のイメージ例

継承は親クラスの機能を子クラスに引き継がせるので、子クラスは親クラスの機能が使えるようになります。

スポンサーリンク

継承のメリット

それでは、継承のメリットをオブジェクト指向言語である「Java」を使い説明していきます。

例えば、次のような「新車クラス」と「中古クラス」があるとします。この2つのクラスは継承を利用していません。

[新車クラス]

public class NewCar {
    /**
     * 製造元
     */
    private static final String MANUFACTURER = "○○自動車";
    
    /**
     * 製造元と販売価格を出力する
     * @param price 販売価格
     */
    private void print(int price) {
        System.out.println("製造元は" + MANUFACTURER);
        System.out.println("販売価格は" + price + "円");
    }
    
    /**
     * 新車の製造元と販売価格を出力する
     * @param price 販売価格
     */
    public void printNewCar(int price) {
        System.out.println("新車です");
        print(price);
    }
}

[中古クラス]

public class OldCar {
    /**
     * 製造元
     */
    private static final String MANUFACTURER = "○○自動車";
    
    /**
     * 製造元と販売価格を出力する
     * @param price 販売価格
     */
    private void print(int price) {
        System.out.println("製造元は" + MANUFACTURER);
        System.out.println("販売価格は" + price + "円");
    }
    
    /**
     * 中古車の製造元と販売価格を出力する
     * @param price 販売価格
     */
    public void printOldCar(int price) {
        System.out.println("中古車です");
        print(price);
    }
}

「新車クラス」と「中古クラス」はどちらも車に関連するクラスであり、以下の内容がまったく同じです。

継承を使わない場合
ほんとだ... まったく同じ内容を「新車クラス」と「中クラス」に書いてる。

このように同じ内容のソースコードを色々な個所に書くと、修正する際に複数の個所を直す必要があり(また修正漏れが発生する可能性もある)保守性が悪くなります。

そのため、共通的な部品は「共通クラス」として管理するか「継承」して管理します。(例えば、色々なクラスで使う共通的な部品であれば共通クラス、車クラスの共通部品であれば車の親クラスで管理など)

スポンサーリンク

そこで、継承を利用します。

[車の基本クラス]

public class BaseCar {
    /**
     * 製造元
     */
    private static final String MANUFACTURER = "○○自動車";
    
    /**
     * 製造元と販売価格を出力する
     * @param price 販売価格
     */
    protected void print(int price) {
        System.out.println("製造元は" + MANUFACTURER);
        System.out.println("販売価格は" + price + "円");
    }
}

[基本クラスを継承した新車クラス]

public class NewCar extends BaseCar {
    
    /**
     * 新車の製造元と販売価格を出力する
     * @param price 販売価格
     */
    public void printNewCar(int price) {
        System.out.println("新車です");
        print(price);
    }
}

[基本クラスを継承した中古クラス]

public class OldCar extends BaseCar {
    
    /**
     * 中古車の製造元と販売価格を出力する
     * @param price 販売価格
     */
    public void printOldCar(int price) {
        System.out.println("中古車です");
        print(price);
    }
}

上記のように継承を使うことで、車の共通的な機能は親クラスで管理し、子クラスでは、子クラス独自の機能を実装するだけです。

継承を利用することで、何度も同じソースコードを書かずに済み、読みやすいソースコードが書けます。

ただし、継承もやりすぎると"保守性"や"可読性"が悪くなる場合もあるので、しっかりと検討したうえで継承を使うことが大切です。

helpful