はじめに
オブジェクト指向プログラミングの三大要素って知っていますか?
-
- クラス(カプセル化)
-
- 継承
-
- ポリモーフィズム
この記事では、三大要素の1つである「継承」を解説します。
ポリモーフィズムについては、 こちらの記事で解説しています。
継承とは?
一言でいうと、オブジェクト(クラス)の共通点と相違点を整理するためのしくみです。
いわゆる「is-a関係」です。
is-a関係とは、A is a B. のことで、日本語だと「AはBの一種」という意味です。
また、数学の概念では、「全体集合と部分集合」の関係です。
(例)
- 哺乳類は動物の一種(他にも、魚類や両生類も動物の一種です)
- イチゴはバラ科の一種(他にも、サクラ、ウメ、モモもバラ科の一種です)
補足
@shiracamusさんより「スーパークラスは、共通機能の最小セット」とコメントいただきます。
スーパークラスとサブクラス
- スーパークラスとは
- 全体集合のことです。
- 前述の例では、「動物」や「バラ科」がスーパークラスに相当します。
- 全体集合で共通の性質を定義します。
- サブクラスとは
- 部分集合のことです。
- 前述の例では、「哺乳類」や「イチゴ」がサブクラスに相当します。
- 部分集合で固有の性質を定義します。
なぜ継承が重要なのか?
- プログラムの無駄をなくすためです。つまり、プログラム作成の効率性やメンテナンス性が向上します。
- 例えばクラスA, クラスB, クラスCに同じメソッドがあったとします。
- そのメソッドを修正する必要があったとき、クラスA, クラスB, クラスCの3箇所を修正しなければいけません。
- 上記は無駄な作業です!(プログラム修正、テスト実施の工数が発生します)
- 必ず持たせたい機能(メソッド)をスーパークラスで定義しておけば、そのスーパークラスを継承した全サブクラスに同じ機能を持たせることができます。
- 全てのクラスのスーパークラスであるObjectクラスには、文字列化するtoStringメソッドが定義されています。
- 「ポリモーフィズム」にも通じる概要です。
継承の具体的なプログラミング例
プログラム概要
- じゃんけんプログラムです。
- じゃんけんのプレイヤーは人とロボットです。
- プレイヤーをスーパークラス、人とロボットをサブクラスとします。
- プレイヤーの動作(じゃんけんするjankenメソッド)をスーパークラスで共通化しています。
- 人とロボット、どちらもじゃんけんできます(jankenメソッドを呼び出せます)。
スーパークラス
Player.java
public class Player {
public void janken() {
// じゃんけんの処理
}
}
サブクラス
形式:サブクラス名 + extends + スーパークラス名
Person.java
public class Person extends Player {
// 省略
}
Robot.java
public class Robot extends Player {
// 省略
}
メインクラス
MainClass.java
public class MainClass {
public static void main(String[] args) {
Person person = new Person();
Robot robot = new Robot();
// じゃんけんする
person.janken();
robot.janken();
}
}
まとめ
継承とは?
- クラスの共通点と相違点を整理するためのしくみです。
- スーパークラス
- 全体集合
- 共通点を定義するクラス
- is-a関係(A is a B.)の「B」に相当するクラス
- サブクラス
- 部分集合
- 相違点を定義するクラス
- is-a関係(A is a B.)の「A」に相当するクラス
- スーパークラス
なぜ継承が重要なのか?
- プログラムの無駄をなくすためです。
- プログラムの修正やテストにかかるコストを減らせるためです。これは、実務では非常に重要な観点です。
参考文献
- オブジェクト指向でなぜつくるのか 第2版
オブジェクト指向をもっと勉強したい方は一読をオススメします。
Amazonでも購入できます。