基本情報 令和7年度 科目A 問12:テクノロジ系に関する問題
オブジェクト指向プログラミングの特徴のうち,異なるクラスのオブジェクトを同 一のインタフェースで操作したときに,操作対象クラスに応じた異なる動作を可能に することを何と呼ぶか。
- a委譲
- b継承
- cコンポジション
- d多相性正答
AI解説(初心者・標準・上級)
理解度に合わせて3レベルの解説を無料で読めます。
答えは d「多相性(ポリモーフィズム)」 です。
「多相性」は、同じ命令を出しても、相手によって違う動きをしてくれる仕組み。
たとえば「鳴いて!」と命令したとき:
- 犬なら「ワン!」
- 猫なら「ニャー!」
- 牛なら「モー!」
同じ「鳴く」という命令なのに、誰が受け取るかで結果が違いますよね。これがポリモーフィズム(多相性/多態性)です。プログラムでも、同じ呼び出し方で、クラスごとに違う処理をさせられる便利な機能。
👉 覚え方:ポリ(複数)+モルフ(形)=多くの形に変わる。
ほかの選択肢:a 委譲=別のオブジェクトに仕事を頼む/b 継承=親の機能を引き継ぐ/c コンポジション=複数の部品を組み合わせて作る。どれもオブジェクト指向の用語ですが、別の概念です。
なぜこれが正解か
正解は d。多相性(ポリモーフィズム/Polymorphism、多態性とも) は、オブジェクト指向の3大特徴(カプセル化・継承・多相性)の一つ。同一のメッセージ(メソッド呼び出し)に対し、受け取るオブジェクトのクラスに応じて異なる動作を実行できる性質。実現方式は2つ:
1. オーバーライド(サブクラスで親クラスのメソッドを再定義)
2. オーバーロード(同名メソッドを引数違いで複数定義)
例:図形クラスの `draw()` メソッドを円・四角・三角がそれぞれ独自実装。`shape.draw()` の呼び出しで実体に応じた描画が行われる。
各選択肢の解説
- a 委譲(Delegation):自オブジェクトが受け取った処理を別オブジェクトに転送する手法。継承の代替として使われる。
- b 継承(Inheritance):親クラスの属性・メソッドを子クラスが引き継ぐ仕組み。多相性の前提技術だが「異なる動作」の本質ではない。
- c コンポジション(Composition):複数のオブジェクトを部品として組み合わせる「has-a 関係」の構成。
- d 多相性:上記の通り、同一インタフェースで異なる動作を実現。正解。
覚え方・ひっかけ注意
オブジェクト指向3大特徴:
- カプセル化:データと処理を1つにまとめ、外部から隠す(情報隠蔽)
- 継承:is-a 関係、共通機能を親から引き継ぐ
- 多相性:同じ呼び出しで異なる振る舞い
の3点セットを順番に言えるように。「同一インタフェース」「異なる動作」のキーワードがあれば多相性。継承(b)と紛らわしいが、継承は仕組み、多相性はその活用効果。委譲とコンポジションは GoF デザインパターンで頻出語彙なので押さえる。
理論的背景
多相性の分類(Strachey/Cardelli の分類):
1. アドホック多相:オーバーロード(同名メソッドの多重定義)、型強制(暗黙の型変換)
2. パラメトリック多相:ジェネリクス/テンプレート(C++ template、Java/C# generics、Rust 等)
3. 包含多相(サブタイプ多相):継承による上位型への代入と動的ディスパッチ。最も狭義の「ポリモーフィズム」
4. 行多相・ダックタイピング:構造的部分型(TypeScript、Go の interface)、Python・Ruby の動的型付け
実装機構は動的束縛(dynamic binding/late binding):仮想関数テーブル(vtable)でメソッド呼び出しを実行時解決。C++ では `virtual` 指定、Java・C# はデフォルトで仮想(C# は明示 `virtual/override`)。
実務での使われ方
- デザインパターンとの関係:GoF の Strategy、Template Method、State、Command、Visitor、Factory Method 等はすべて多相性が骨格。「具象に依存せず抽象に依存」(SOLID の D:依存性逆転原則)の実現手段。
- テスト容易性:モックオブジェクト・スタブで本物の代替実装を注入できる(依存性注入=DI)。Spring・Guice・.NET DI 等の DI コンテナが活用。
- インタフェース vs 抽象クラス:Java 8 以降の default method、C# の default interface methods で境界が曖昧化。Go・Rust は明示的な継承を避け、インタフェース/トレイトのみで多相を実現。
- ジェネリクスの普及:型安全性とコード再利用を両立。C++ のテンプレートは静的多相(コンパイル時展開)、Java のジェネリクスは型消去(type erasure)で実装。
試験での位置づけ
科目A「ソフトウェア」「プログラミング」の頻出領域。基本情報・高度試験では:
- 3大特徴(カプセル化・継承・多相性)の定義と具体例
- 静的多相(オーバーロード・テンプレート)と動的多相(オーバーライド)の区別
- SOLID 原則(5原則:SRP・OCP・LSP・ISP・DIP)、特に LSP(リスコフの置換原則)は多相性の正しさを規定
- GoF デザインパターン23種の構造と用途
- UML クラス図・シーケンス図での表現
まで深掘り。
選択肢の発展補足
- 委譲(選択肢 a):「継承より委譲を選べ」(Effective Java 等)が現代のセオリー。継承は密結合、委譲は疎結合。Decorator・Adapter パターンの中核。
- 継承(選択肢 b):誤用が多く「継承よりコンポジション」が原則。is-a 関係でない場合に継承を使うと LSP 違反になる。多重継承の菱形問題(C++)、Java・C# のインタフェース多重実装による回避。
- コンポジション(選択肢 c):has-a 関係。Composite パターン(再帰構造)、Strategy パターン(戦略の差し替え)の基盤。「Composition over Inheritance」が現代設計原則。
- 動的型付け言語のダックタイピング:「アヒルのように歩き、アヒルのように鳴くなら、それはアヒル」。型より振る舞いで判断する多相性の極致。Python・Ruby・JavaScript で多用。
出典:IPA(情報処理推進機構)公式 基本情報技術者試験 令和7年度 科目A 問12/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビによる独自AI解説です。