Files
2026-10-05 11:23:25 +09:00

4.7 KiB
Raw Permalink Blame History

Question15 - 多態性(ポリモーフィズム)

本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。

この問題のねらい

  • 変数の型(扱いとしての種類)と、実際に代入されているデータの種類が異なっていても、代入先の型として扱えることを理解する
  • 複数の異なる種類のデータを、共通の型としてまとめて一覧に格納し、順に処理できることを理解する
  • 共通の型として扱っている変数を、元々の具体的な種類として扱いなおす(型の変換)方法を理解する

以下の設問はそれぞれ独立したプログラムとして実装してください。


共通のデータ定義(各設問で共通して使用する)

以下の3種類のデータ定義を、共通の性質を引き継ぐ関係を使って作成したうえで、各設問に解答してください。これらは全ての設問で共通して使用し、内容は変更しないものとします。

種類1: Car(車)

  • 保持するデータ
    • 名前(文字列)
    • 速度(整数)
  • 生成方法:生成時に名前・速度の初期値を指定できる
  • 振る舞い
    • 走る:(名前)は時速(速度)で走った という文字列を出力する

種類2: SportsCar(スポーツカー)

Carの性質・振る舞いをすべて引き継いだ種類として定義してください。

  • 保持するデータ:Carと同じ(名前・速度)
  • 生成方法:生成時にパラメータを指定できないようにし、生成すると自動的に名前「スポーツカー」・速度100に固定して初期化されるようにする
  • 振る舞い
    • 走る:Carの振る舞いをそのまま使う(独自の内容に置き換えない)
    • ターボで走る(独自に追加する振る舞い):(名前)は時速(速度の3倍)で走った という文字列を出力する

種類3: Truck(トラック)

Carの性質・振る舞いをすべて引き継いだ種類として定義してください。

  • 保持するデータ:Carと同じ(名前・速度)
  • 生成方法:生成時にパラメータを指定できないようにし、生成すると自動的に名前「トラック」・速度30に固定して初期化されるようにする
  • 振る舞い:Carの振る舞い(走る)をそのまま使う。独自の振る舞いは追加しない。

設問1

次の手順を実装してください。

  1. SportsCarの性質を持つインスタンスを1つ生成し、Carの型として扱える変数に代入する
  2. その変数に対して「走る」処理を実行する
    • 出力: スポーツカーは時速100で走った
  3. Truckの性質を持つインスタンスを1つ生成し、Carの型として扱える変数に代入する
  4. その変数に対して「走る」処理を実行する
    • 出力: トラックは時速30で走った
  • 補足: 変数をCarの型として扱っていても、実際に代入されているインスタンスの種類(SportsCarかTruckか)によって「走る」処理の結果が変わることを確認する設問である

設問2

次の手順を実装してください。

  1. SportsCarの性質を持つインスタンスを1つ生成し、Carの型として扱える変数に代入する
  2. Truckの性質を持つインスタンスを1つ生成し、Carの型として扱える変数に代入する
  3. Carの型の値を複数格納できる一覧(配列)を作成し、上記2つのインスタンスを両方追加する
  4. 一覧の中身を順番に取り出し、それぞれに対して「走る」処理を実行する
  • 出力:
スポーツカーは時速100で走った
トラックは時速30で走った

設問3

  1. Carの型として扱える変数 car を宣言し、SportsCarの性質を持つインスタンスを1つ生成して代入してください
  2. 変数 car が保持しているインスタンスを、SportsCar固有のふるまい(ターボで走る)を呼び出せる形に変換してください
  3. 変換した後、ターボで走る処理を実行してください
    • 出力: スポーツカーは時速300で走った
  • 補足: 変数をCarの型のまま扱っている状態では、SportsCarだけが持つ独自のふるまい(ターボで走る)は呼び出せない。呼び出せるようにするために必要な変換を行うこと