基本情報技術者 2015年 春期 午前(科目A) 問48
問題文
オブジェクト指向の考え方に基づくとき、一般に“自動車”のサブクラスといえるものはどれか。
選択肢
ア:エンジン
イ:製造番号
ウ:タイヤ
エ:トラック(正解)
🔒 解説は解答すると表示されます
自動車のサブクラス概念【午前解説】
正解の理由
選択肢の中でサブクラス(継承で表すべき)に当たるのは エ(トラック)です。オブジェクト指向で「サブクラス」は「スーパークラスの一種である(is‑a)」という関係を満たす概念を指します。トラックは自動車(自動車クラス)の具体的な種類であり、「トラックは自動車である(Truck is‑a Automobile)」と自然に言えます。したがってトラックは自動車のサブクラスになります。
一方、エンジンやタイヤは自動車が「持つ部品(has‑a)」であり、製造番号は自動車の「属性(プロパティ)」にすぎません。これらは継承ではなく合成(composition)やフィールドで表現します。
解法ステップ
- 問題文の「基底クラス」を特定(ここでは“自動車”)。
- 各選択肢について「is‑a(〜である)」か「has‑a(〜を持つ)」か「属性か」を判定する。
- 「is‑a」に該当するものがあればサブクラス候補とする。該当しないものは誤答。
- 抽象度の差が大きい場合は「is‑a が成り立たない」と判断する(例:製造番号は抽象度が低すぎる)。
- 最終的に is‑a を満たす選択肢を選ぶ。
選択肢別の誤答解説
- ア: エンジン
エンジンは自動車が「持つ」部品であり has‑a 関係です。従ってサブクラスではなく、合成(フィールド)で表現します。 - イ: 製造番号
製造番号は自動車の属性(プロパティ)でありクラスそのものではありません。属性はクラスのフィールドで表現します。 - ウ: タイヤ
タイヤもエンジン同様に部品(has‑a)です。車種の違いではなく、構成要素なので継承の対象にはなりません。 - エ: トラック
トラックは自動車の「一種」であり is‑a 関係を満たすため、サブクラスとして表現するのが適切です。
よくある誤解
- 「部品もサブクラスになる」と考える誤解:部品は is‑a ではなく has‑a の関係なので継承でなく合成で表現します。
- 「具体性=サブクラス」と混同する誤解:単に具体的であること(物理的存在や詳細)だけでは継承対象にならず、スーパークラスとの関係性が重要です。
- 「属性をクラス化すればいい」とする誤解:製造番号のような属性を無理にクラスにするとモデルが複雑化し、誤った継承階層を作る原因になります。
補足コラム
継承は便利ですが濫用すると設計が固くなります。設計のポイントは以下です。
- Liskov 置換原則(LSP):サブクラスはスーパークラスの振る舞いを壊してはいけません。
- 合成優先の原則:部品や機能は継承ではなく合成で組み合わせられるべき場合が多い。
- UML 表記では継承は空三角矢印(一般化)で示し、集約・コンポジションは線+菱形で示します。
簡単なコード例(Python)で継承と合成を比較します。
# 継承(is-a)
class Automobile:
def drive(self):
print("走行する")
class Truck(Automobile):
def load(self):
print("荷物を積む")
# 合成(has-a)
class Engine:
def start(self):
print("エンジン始動")
class Car:
def __init__(self):
self.engine = Engine() # has-a
def drive(self):
self.engine.start()
print("走行する")
FAQ
Q. タイヤは状況によってサブクラスになり得ますか?
A. タイヤ自体は普通は部品なのでサブクラスではありません。ただし「競技用タイヤ」が「タイヤ」のサブクラスであるように、文脈が「タイヤの種類」を問う場合は継承関係になります。問題文の基底が「自動車」であればタイヤは has‑a です。
A. タイヤ自体は普通は部品なのでサブクラスではありません。ただし「競技用タイヤ」が「タイヤ」のサブクラスであるように、文脈が「タイヤの種類」を問う場合は継承関係になります。問題文の基底が「自動車」であればタイヤは has‑a です。
Q. 製造番号のような属性をクラスにすべきケースはありますか?
A. 属性を独立クラスにするのは、その属性が独自の振る舞いや多様な状態を持つときです。単純な識別子は属性のままが適切です。
A. 属性を独立クラスにするのは、その属性が独自の振る舞いや多様な状態を持つときです。単純な識別子は属性のままが適切です。
Q. 「is‑a」の判断に迷ったら?
A. 「A は B である」と自然言語で言えるかを基準にします。自然な「A は B である」が成立すれば is‑a の可能性が高いです。
A. 「A は B である」と自然言語で言えるかを基準にします。自然な「A は B である」が成立すれば is‑a の可能性が高いです。
関連キーワード: オブジェクト指向、継承、合成(コンポジション)、is-a、has-a、UML、Liskov 置換原則、クラス設計、継承の使いどころ

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

