「継承は最後の手段」とは?新人エンジニアのためのやさしい解説
こんにちは。ゆうせいです。
今回はオブジェクト指向の学習でよく出てくる言葉、
「継承は最後の手段」というアドバイスについて、初心者でもわかるようにやさしく解説します。
「え?継承って便利じゃないの?」「親クラスを作って再利用すればいいのでは?」
そう思った方にこそ、ぜひ読んでほしい内容です!
継承は本当に強力!でも…
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年10月27日重回帰分析はディープラーニングの「細胞」だった?"ご先祖様"と"最強の進化系"のつながりを徹底解剖
山崎講師2025年10月27日機械学習の"ご先祖様"?重回帰分析が今も最強の「基礎」である理由
山崎講師2025年10月27日ディープラーニングの「常識」を疑え!相関分析が“無力”に見える理由と、それでも使うべき本当の価値
山崎講師2025年10月27日相関分析は最強の「データスカウト」!機械学習の精度を上げる”相棒”の正体とは