「継承は最後の手段」とは?新人エンジニアのためのやさしい解説

こんにちは。ゆうせいです。

今回はオブジェクト指向の学習でよく出てくる言葉、
「継承は最後の手段」というアドバイスについて、初心者でもわかるようにやさしく解説します。

「え?継承って便利じゃないの?」「親クラスを作って再利用すればいいのでは?」
そう思った方にこそ、ぜひ読んでほしい内容です!


継承は本当に強力!でも…

Javaでは、extends を使って親クラス(スーパークラス)から機能を引き継げます。

class Animal {
    void eat() {
        System.out.println("食べる");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("ワン!");
    }
}

このように、DogAnimaleat()をそのまま使えます。
便利でコードも短くなります!


でもなぜ「最後の手段」なの?

理由1:結合が強くなる(密結合)

子クラスは、親クラスの実装に強く依存します。
もし親クラスのコードを変えたら、子クラスにまで影響が及ぶことがあります。

まるで「親が髪型を変えたら、子どもも変えなきゃいけない」ような状態です。


理由2:設計が硬直化する

Javaでは単一継承の制限があるため、1つのクラスしか継承できません。

class A {}
class B {}
class C extends A, B {} // ❌ これはできない!

複数の役割を持たせたいときに柔軟な設計ができなくなるんです。


理由3:誤用されやすい

「コードを共通化したいからとりあえず親クラスにする」
こういった使い方をすると、本当に「is-a」関係かどうか曖昧な設計になります。

例えば:

class Person {}
class Teacher extends Person {}
class Chair extends Person {} // ❌ これは人ではない!

→ こうなるとコードの意味が破綻してしまいます。


じゃあどうすればいいの?

代替手段:委譲(Composition)やインターフェースの活用

Javaでは「共通の機能を使いたいなら、継承ではなく委譲やインターフェースを使うべき」という考えが推奨されています。

例:委譲(Composition)

class Engine {
    void start() {
        System.out.println("エンジン始動!");
    }
}

class Car {
    private Engine engine = new Engine();
    
    void startCar() {
        engine.start(); // 委譲して動かす
    }
}

CarEngineを「持っている」だけで、継承していません。
これなら、必要な機能だけ安全に使えます!


まとめ:「継承」は便利だけど慎重に

考え方使い方
再利用したいから継承?❌ 安易な共通化に注意
「AはBの一種か?」✅ 本当のis-a関係ならOK
柔軟で安全な設計にしたい✅ 委譲やインターフェースを活用

学習の指針と次のステップ

  • まずは継承のメリットとデメリットを実感する練習をしよう
  • 「委譲 vs 継承」のコードを書き比べてみよう
  • SOLID原則(特にLSPとISP)にも触れてみよう

「継承は最後の手段」というのは、「使うな」ではなく「本当に必要か慎重に考えよう」という先輩からのメッセージなんです!

もっと具体的な例や設計パターンも見たいですか?

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。