オブジェクト指向の問題の解き方
飛岡拓希公開
クラスの問題は、インスタンス(クラスから作ったもの)ごとに箱を1つ描きます。変数は、箱を指す矢印です。メソッドを呼ぶ行では、矢印の先の箱が、どのクラスから作られたかで、実行される中身が決まります。
クラスの説明は、問題文にある
擬似言語には、クラスを書く共通の形が公式には定められていません。 そのため科目B のクラスの問題では、クラスが何を表し、どんなメンバ変数とメソッドを持つかが、問題文や表で説明されます。プログラムを読む前に、その説明を先に読みます。
メンバ変数やメソッドは、. で指します。a.value は「a が指すインスタンスの value」、a.up() は「a が指すインスタンスの up を呼ぶ」です。
インスタンスごとに箱を描く
次のプログラムを実行すると、何が出力されるでしょうか。
○クラス Counter
整数型: value
○コンストラクタ Counter()
自身.value ← 0
○手続: up()
自身.value ← 自身.value + 1
○実行プログラム
Counter: a ← Counter()
Counter: b ← Counter()
Counter: c ← a
a.up()
c.up()
b.up()
a.value と b.value を出力する紙には、インスタンスを箱、変数を矢印で描きます。
a ─┐
├→ [ Counter | value: 0 → 1 → 2 ]
c ─┘
b ───→ [ Counter | value: 0 → 1 ]出力は a.value が 2、b.value が 1 です。
- ・
Counter()を2回呼んだので、箱は2つ。a と b は別の箱で、value もそれぞれに1つずつある - ・
c ← aは、新しい箱を作りません。c は a と同じ箱を指すだけ - ・そのため c.up() は a の箱の value を増やす。a.up() と合わせて2回
一番多い間違いは、c ← a で箱がコピーされると考えて、a.value を 1 と答えることです。箱が増えるのは、コンストラクタを呼んだ行だけです。箱の数を先に数えておくと防げます。
継承したら、呼ばれるメソッドは「箱のクラス」で決まる
継承は、親クラスのメンバ変数とメソッドを、子クラスがそのまま持つことです。 子クラスが同じ名前のメソッドを書き直すこと(オーバーライド)もできます。
○クラス Shape
○文字列型: name()
return "図形"
○手続: describe()
自身.name() + "です" を出力する
○クラス Circle は Shape を継承する
○文字列型: name()
return "円"
○実行プログラム
Shape: s ← Circle()
s.describe()出力は 「円です」です。「図形です」ではありません。追い方はこうです。
- 1. s が指す箱は、
Circle()で作ったので Circle の箱。変数の型が Shape でも、箱は Circle - 2. describe() は Circle に書かれていないので、親の Shape の describe() が動く
- 3. その中の
自身.name()の「自身」は、Circle の箱。Circle には name() があるので、Circle の name() が呼ばれる
メソッドを呼ぶたびに「この箱は何クラスか → そのクラスにこのメソッドはあるか → 無ければ親へ」と1段ずつ確かめます。 親のメソッドの中から呼ばれたメソッドでも、箱が子クラスなら、子クラスのものが先に探されます。 呼ばれる順番を問う問題は、この確かめを1行ずつ書き出せば解けます。
オブジェクト指向の問題:
- 継承した子クラスから親のコンストラクタを呼ぶ(難易度 2・登録なしで解けます)
- オーバーライドしたメソッドが呼ばれる順を追う(難易度 3・登録なしで解けます)
ほかの分野の解き方
解いたあとに解説を読む
このサイト(極とれ)の問題は、解いたあとにトレースの手順と、 選択肢ごとに「なぜ違うか」が開きます。登録なしで解けます。
オブジェクト指向の練習問題を見る記法は IPA が公開しているサンプル問題・公開問題の記述形式に基づいています。 出題形式は改訂されることがあるため、受験の際は IPA の公表内容をご確認ください。
この記事について
書いているのは飛岡拓希です。基本情報技術者試験の科目B だけを扱う学習サービス「極とれ」を 1人で作って運営しています。試験には高校3年生のときに合格しました(そのときの記録)。
数字を載せるときは、出典の資料を自分で開いて数えた値だけを使い、いつ時点のものかを本文に書いています。 誤りに気づいたら goku.tore9@gmail.com までお知らせください。読んだ感想はフォームからも送れます。