基本情報技術者 2025年 科目A 問12
問題文
オブジェクト指向プログラミングの特徴のうち、異なるクラスのオブジェクトを同一のインタフェースで操作したときに、操作対象クラスに応じた異なる動作を可能にすることを何と呼ぶか。
選択肢
ア:委譲
イ:継承
ウ:コンポジション
エ:多相性(正解)
🔒 解説は解答すると表示されます
多相性(ポリモーフィズム)【午前解説】
正解の理由
問題は「異なるクラスのオブジェクトを同一のインタフェースで操作したときに、操作対象クラスに応じて異なる動作を行える」性質を問うています。これはオブジェクト指向で言うところの多相性(ポリモーフィズム)そのものであり、同じ呼び出し(メソッド名やインタフェース)に対して、実際のオブジェクトの型に応じた振る舞いが実行されます。選択肢の中では多相性を指すものがエであり、したがって正解はエです。
解法ステップ
- 問題文のキーワードを探す:「異なるクラス」「同一のインタフェースで操作」「操作対象に応じた異なる動作」など。
- 各用語の定義を思い出す:
- 多相性:同一インタフェースで異なる具体実装を扱い、適切な動作が実行される性質(動的結合/動的ディスパッチ)。
- 継承:クラス間の関係(スーパークラス・サブクラス)を作る機構。
- 委譲・コンポジション:オブジェクトの関係(委任・部品として持つ)を表す。
- 上記を照合して、設問の条件に最も合致する用語を選ぶ(多相性)。
選択肢別の誤答解説
- ア: 委譲
- 意味:あるオブジェクトが処理を他のオブジェクトに委ねる(メソッド呼び出しを転送する)設計手法。処理を外部のオブジェクトに任せる点は多相性とは異なるため不正解です。
- イ: 継承
- 意味:あるクラスが別のクラスの性質(コード)を受け継ぐこと。多相性を実現する手段の一つになり得ますが、問題文が問う「同一インタフェースで異なる動作を行う性質」自体は継承ではなく多相性なので不正解です。
- ウ: コンポジション
- 意味:クラスが他のクラスのインスタンスを部品(has-a)として持つ設計。オブジェクトの再利用や柔軟性を高めますが、設問の「同一インタフェースで異なる振る舞い」を直接指す語ではありません。
- エ: 多相性
- 意味:同一のインタフェース(呼び出し)に対して、オブジェクトの型に応じて異なる処理が実行される性質。設問文に完全に一致するため正解です。
よくある誤解
- 「多相性 = 継承」と混同する
- 継承は多相性を実現する一手段に過ぎません。インタフェースや委譲、ダックタイピングでも多相性は実現できます。
- 「コンポジションと委譲の区別がつかない」
- コンポジションはオブジェクトを持つ設計(has-a)。委譲はメソッド呼び出しを別オブジェクトに渡す具体的な振る舞い。目的と文脈で使い分けます。
- 「オーバーロード(同名のメソッドの多重定義)も多相性だ」と誤認する
- メソッドオーバーロードは静的(コンパイル時)に決まるものが多く、設問の「実行時に対象クラスに応じて動作が変わる」多相性(動的ディスパッチ)とは区別されます。
補足コラム
多相性には大きく分けて「実行時多相性(ランタイム・サブタイプ多相)」と「静的多相性(コンパイル時、多相的振る舞い)」があります。実際のオブジェクト指向設計では、インタフェース(または抽象クラス)を使ったサブタイプ多相が一般的です。例を示します。
Java(インタフェースとオーバーライド)の例:
interface Shape {
double area();
}
class Circle implements Shape {
double r;
Circle(double r){ this.r = r; }
public double area(){ return Math.PI * r * r; }
}
class Square implements Shape {
double a;
Square(double a){ this.a = a; }
public double area(){ return a * a; }
}
void printArea(Shape s) {
System.out.println(s.area()); // 呼び出し時に実際の型のarea()が実行される
}
Python(ダックタイピング)の例:
class Duck:
def quack(self): print("ガー")
class Person:
def quack(self): print("真似してガー")
def make_quack(x):
x.quack() # 型を問わずquackメソッドがあれば動作する(多相的)
また、設計原則としてLiskovの置換原則(サブタイプはスーパタイプと置換可能であるべき)も多相性と密接に関係します。
FAQ
Q. 多相性は必ず継承が必要ですか?
A. いいえ。継承は多相性を実現する手段の一つですが、インタフェース実装、委譲、あるいはダックタイピングでも多相性は生じます。
A. いいえ。継承は多相性を実現する手段の一つですが、インタフェース実装、委譲、あるいはダックタイピングでも多相性は生じます。
Q. メソッドのオーバーロードも多相性ですか?
A. オーバーロードは「同名で異なる引数を持つ複数定義」で、言語によっては静的結合(コンパイル時決定)となるため、問題文が意図する「実行時にオブジェクトの型で振る舞いが変わる」多相性とは区別されます。
A. オーバーロードは「同名で異なる引数を持つ複数定義」で、言語によっては静的結合(コンパイル時決定)となるため、問題文が意図する「実行時にオブジェクトの型で振る舞いが変わる」多相性とは区別されます。
Q. 多相性の利点は何ですか?
A. コードの拡張性・再利用性を高め、同一のインタフェースで異なる実装を差し替え可能にすることで保守性を向上させます。
A. コードの拡張性・再利用性を高め、同一のインタフェースで異なる実装を差し替え可能にすることで保守性を向上させます。
関連キーワード: ポリモーフィズム、動的結合、仮想関数、サブタイプ、多態性

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

