「継承は最後の手段」とは?新人エンジニアのためのやさしい解説
こんにちは。ゆうせいです。
今回はオブジェクト指向の学習でよく出てくる言葉、
「継承は最後の手段」というアドバイスについて、初心者でもわかるようにやさしく解説します。
「え?継承って便利じゃないの?」「親クラスを作って再利用すればいいのでは?」
そう思った方にこそ、ぜひ読んでほしい内容です!
継承は本当に強力!でも…
Javaでは、extends
を使って親クラス(スーパークラス)から機能を引き継げます。
class Animal {
void eat() {
System.out.println("食べる");
}
}
class Dog extends Animal {
void bark() {
System.out.println("ワン!");
}
}
このように、Dog
はAnimal
のeat()
をそのまま使えます。
便利でコードも短くなります!
でもなぜ「最後の手段」なの?
理由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(); // 委譲して動かす
}
}
→ Car
はEngine
を「持っている」だけで、継承していません。
これなら、必要な機能だけ安全に使えます!
まとめ:「継承」は便利だけど慎重に
考え方 | 使い方 |
---|---|
再利用したいから継承? | ❌ 安易な共通化に注意 |
「AはBの一種か?」 | ✅ 本当のis-a関係ならOK |
柔軟で安全な設計にしたい | ✅ 委譲やインターフェースを活用 |
学習の指針と次のステップ
- まずは継承のメリットとデメリットを実感する練習をしよう
- 「委譲 vs 継承」のコードを書き比べてみよう
- SOLID原則(特にLSPとISP)にも触れてみよう
「継承は最後の手段」というのは、「使うな」ではなく「本当に必要か慎重に考えよう」という先輩からのメッセージなんです!
もっと具体的な例や設計パターンも見たいですか?
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール

- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
最新の投稿
山崎講師2025年5月9日「テストのしやすさ」を考えたクラス設計とは?Javaを例に新人エンジニア向けにやさしく解説!
山崎講師2025年5月9日合成と集約の違いとは?新人エンジニア向けにやさしく解説!
山崎講師2025年5月9日委譲と集約の違いとは?Javaを使って新人エンジニアにやさしく解説!
山崎講師2025年5月9日「継承は最後の手段」とは?新人エンジニアのためのやさしい解説