FE EXAM

抽象クラス(実体化できない共通の親)

共通部分を定義し単独では実体化できない基底クラス。

DIAGRAM
抽象クラス(実体化不可)
抽象メソッド(中身未定)
具象クラス(実体化可)
«abstract» Shape(図形)共通の実装(そのまま使える)describe() 「私は図形です」抽象メソッド(中身は未定)area() ← 面積の求め方は子に任せる未完成なので、このクラス単独ではインスタンス化できないCircle(円)継承した describe() はそのまま使える抽象メソッドを実装して完成させるarea() { return π×r×r }インスタンス化できる ✓Rectangle(長方形)継承した describe() はそのまま使える抽象メソッドを実装して完成させるarea() { return w×h }インスタンス化できる ✓共通部分は親にまとめ、図形ごとに違う部分(面積の求め方)だけを子が実装する白抜き三角の矢印は「継承(〜を引き継ぐ)」を表す
解説

📌
抽象クラスとは

未完成なので実体は作れない抽象クラス共通部分+未定の操作new できない

抽象クラスとは、複数のクラスに共通する部分を定義する一方で、中身が未完成な部分を含むため、それ単独では実体(インスタンス)を作れない基底クラスのことです。基底クラスとは、他のクラスのもとになる親クラスのことです。

抽象クラスには、中身を書かずに名前だけ宣言した抽象メソッド(=処理の中身を子クラスに任せる、未完成のメソッド)を持たせられます。未完成なので、その抽象クラスから直接オブジェクトを作ることはできません。

身近な例で考えると、「図形」という言葉に似ています。「図形」は円や長方形に共通する考え方ですが、「図形そのもの」を1つ描くことはできません。実際に描けるのは円や長方形といった具体的な図形だけです。上の図解で、親の Shape は実体化できず、子の CircleRectangle だけが実体化できる様子を確認してください。

📌
インタフェースとの違い

抽象クラスとよく似たものにインタフェース(=クラスが満たすべき操作だけを定めた仕様)があります。どちらも単独では実体化できませんが、次の点が違います。

項目抽象クラスインタフェース
実装済みメソッド持てる原則として持たない(仕様だけ)
属性(データ)持てる原則として持たない
主な役割共通の中身を子に引き継ぐ満たすべき操作の約束を決める
同時に持てる数通常は1つだけ継承複数を同時に実装できる

ざっくり言うと、抽象クラスは「共通の中身を持った未完成の親」インタフェースは「中身を持たず、操作の名前だけを約束する仕様書」です。共通の処理をまとめて引き継がせたいなら抽象クラス、ただ「この操作を備えていること」だけを約束させたいならインタフェースを使います。

身近な例で言えば、抽象クラスは「半完成の料理キット」(共通の下ごしらえ済み、仕上げだけ自分で行う)、インタフェースは「レシピの完成条件リスト」(作り方は自由だが満たすべき条件だけ決まっている)のような関係です。

📌
用途

共通部分は1か所、違う部分は子で実装共通の親子A子B子C

抽象クラスは、複数の子クラスに共通する部分をまとめつつ、子ごとに違う部分を必ず実装させたいときに使います。主な用途は次の通りです。


共通処理の集約:子クラスに共通する属性やメソッドを親に1か所だけ書き、重複を減らせます
実装の強制:抽象メソッドを置くと「子クラスは必ずこの操作を実装すること」を強制でき、書き忘れを防げます
共通の型として扱う:「図形なら何でも」というように、子をまとめて親の型として扱い、同じ手順で処理できます

身近な例で考えると、会社の「マニュアルの雛形」のようなものです。共通のあいさつや手順は雛形(親)に書いておき、各部署(子)が自分たちの担当部分だけを必ず埋める──こうすれば全体の統一感を保ちつつ、抜け漏れを防げます。

練習問題

🎯
基本情報技術者 練習問題

Q1.抽象クラスの説明として最も適切なものはどれか。
A.共通部分を定義し、それ単独ではインスタンスを作れない基底クラス
B.すべての操作が実装済みで、そのまま実体を作れるクラス
C.データを一切持たず操作の名前だけを並べたクラス
D.1つのプログラムに1つしか作れない特別なクラス
Q2.抽象クラスとインタフェースの違いとして適切なものはどれか。
A.抽象クラスは操作の名前だけ、インタフェースは実装も持てる
B.抽象クラスは実装済みのメソッドや属性も持てるが、インタフェースは原則として操作の仕様だけを定める
C.抽象クラスもインタフェースもインスタンス化できる
D.抽象クラスは多重継承でき、インタフェースは単一しか実装できない
Q3.抽象クラスを使う主な目的として適切なものはどれか。
A.プログラムの実行速度を上げるため
B.複数の子クラスに共通する部分をまとめ、各子クラスに必ず実装させたい操作を強制するため
C.すべてのクラスを1つに統合してファイル数を減らすため
D.データを暗号化して保護するため

関連コンテンツ