はじめに
オブジェクト指向の説明で「継承」「親クラス」「子クラス」という言葉を見ても、それぞれがどう結び付くのか分かりにくいことがあります。継承は、既存のクラスを土台にして、新しいクラスへ共通する特徴や処理を受け継がせるための仕組みです。
この記事では、クラスベースのオブジェクト指向における継承を中心に、スーパークラスとサブクラスの関係、何を受け継ぐのか、どのような目的で使うのかを整理します。読み終えると、継承の基本的な関係を自分の言葉で説明できるようになります。
クラスとオブジェクトそのものの関係を先に整理したい場合は、クラスとオブジェクトの基本を確認してください。
継承とは
継承とは、既存のクラスを基にして別のクラスを定義し、共通する性質や処理を受け継がせる仕組みです。元になるクラスをスーパークラス、新しく作る側をサブクラスと呼びます。親クラス・子クラス、基底クラス・派生クラスなど、言語や資料によって呼び方が異なる場合もあります。
例えば、「乗り物」というクラスに名前や移動する処理があり、「自動車」というクラスがその共通部分を受け継ぐとします。自動車側では共通部分を一から書き直さず、自動車だけに必要な情報や処理を追加できます。このように、共通部分を土台として差分を加えることが継承の基本です。
スーパークラスとサブクラスの関係
スーパークラスは共通部分を定義する側、サブクラスはその共通部分を受け継いで具体化する側です。サブクラスはスーパークラスとの関係を持ちますが、単なるコピーではありません。元のクラスとの関係を保ちながら、サブクラス独自の特徴を追加できます。
| 用語 | 役割 | 例 |
|---|---|---|
| スーパークラス | 共通する性質や処理を定義する元のクラス | 乗り物 |
| サブクラス | スーパークラスを受け継ぎ、独自の特徴を加えるクラス | 自動車 |
| 継承 | スーパークラスとサブクラスを結び、共通部分を受け継ぐ関係 | 自動車は乗り物の共通部分を受け継ぐ |
この関係は、「サブクラスはスーパークラスの一種として扱える」という整理が自然な場合に理解しやすくなります。自動車は乗り物の一種ですが、エンジンは自動車の一種ではありません。後者のような関係まで継承で表そうとすると、クラス同士の意味が分かりにくくなります。
継承では何を受け継ぐのか
継承では、スーパークラスが持つデータや処理をサブクラス側で利用できるようにします。例えば、乗り物クラスに「名前」という情報と「移動する」という処理があれば、自動車クラスはそれらを共通部分として利用し、自動車だけの情報や処理を追加できます。
ただし、スーパークラスに定義されたものをすべて無条件に同じ方法で利用できるとは限りません。どのメンバーをサブクラスから参照できるか、初期化をどう行うか、既存の処理を置き換えられるかといった細部はプログラミング言語の継承ルールによって異なります。継承の基本を理解する段階では、「共通部分を受け継ぎ、必要な差分を追加できる」と捉えることが重要です。
継承を使う目的
継承を使う主な目的は、複数のクラスに共通する考え方や処理を一か所へまとめ、違いだけをサブクラス側へ持たせることです。同じ内容をそれぞれのクラスへ重複して書くより、共通部分の意図を整理しやすくなります。
- 共通する性質や処理をスーパークラスへまとめる
- サブクラスには固有の違いだけを追加する
- 共通部分の変更箇所を整理しやすくする
ただし、「コードを再利用できる」という理由だけで継承を選ぶと、クラス同士の意味が不自然になることがあります。継承は、共通コードを減らすためだけの仕組みではなく、クラス同士に親子関係として説明できる共通性があるときに使うのが基本です。
継承を使うときの注意点
継承関係が深くなりすぎると、ある処理がどのクラスで定義され、どこで変更されているのか追いにくくなります。スーパークラスの変更が複数のサブクラスへ影響するため、共通化した部分ほど影響範囲を意識する必要があります。
また、サブクラス側でスーパークラスの処理を変更できる言語では、同じ名前の処理でもクラスによって動作が変わることがあります。これは継承を活用する重要な仕組みですが、具体的な構文や実行時の振る舞いは言語によって異なります。まずは親子関係が自然か、共通部分と差分を分ける意味があるかを確認してから継承を使います。
継承を理解するポイント
継承を理解するときは、スーパークラスを「共通部分」、サブクラスを「共通部分を受け継いだうえで違いを追加する側」と考えると整理しやすくなります。継承は、既存クラスをそのまま複製することでも、どのクラスでも自由に結び付けることでもありません。
「自動車は乗り物の一種」のように、サブクラスをスーパークラスの一種として説明できるかを確認すると、関係の妥当性を考えやすくなります。クラスやオブジェクトそのものの基礎は別の知識として扱い、ここでは継承によって親子クラスをどう結ぶかに集中して理解します。
まとめ
継承とは、既存のクラスを土台として、新しいクラスへ共通する性質や処理を受け継がせる仕組みです。元になるスーパークラスと、それを受け継ぐサブクラスの関係を作り、サブクラス側では共通部分を利用しながら固有の違いを追加できます。
継承を使うときは、コードの再利用だけで判断せず、サブクラスをスーパークラスの一種として自然に説明できるかを確認することが大切です。親子関係、共通部分、差分の3点を押さえると、継承の基本を整理できます。