はじめに
今回も、応用情報技術者試験の過去問を解いていきます。
今回は、オブジェクト指向におけるクラス間の関係についての問題です。
オブジェクト指向では、
- クラス
- スーパークラス
- サブクラス
- 継承
- 関連
- 集約
- オーバーライド
といった用語がよく登場します。
似たような言葉が多いため混乱しやすいですが、それぞれの関係を図で整理すると理解しやすくなります。
今回の問題では、特に
「継承した操作をサブクラス側で再定義できるか」
という点が重要です。
問題
オブジェクト指向におけるクラス間の関係のうち、適切なものはどれか。
選択肢
| 選択肢 | 内容 |
|---|---|
| ア | クラス間の関連は,二つのクラス間でだけ定義できる。 |
| イ | サブクラスではスーパークラスの操作を再定義することができる。 |
| ウ | サブクラスのインスタンスが,スーパークラスで定義されている操作を実行するときは,スーパークラスのインスタンスに操作を依頼する。 |
| エ | 二つのクラスに集約の関係があるときには,集約オブジェクトは部分となるオブジェクトと,属性及び操作を共有する。 |
解答
正解:イ
解説
この問題では、オブジェクト指向における
- 継承
- 関連
- 集約
の違いを理解できているかが問われています。
特に正解となる「イ」は、継承とオーバーライドに関する基本的な説明です。
継承とは
継承とは、あるクラスの性質や操作を別のクラスが引き継ぐ仕組みです。
例えば、
動物
├─ 食べる()
└─ 鳴く()
↑ 継承
犬
という関係を考えます。
「動物」がスーパークラス、「犬」がサブクラスです。
犬は動物の一種なので、動物クラスで定義された「食べる」や「鳴く」といった操作を引き継ぐことができます。
オーバーライドとは
サブクラスでは、スーパークラスから継承した操作を再定義できます。
例えば、動物クラスに「鳴く」という操作があったとします。
動物
└─ 鳴く()
↑ 継承
犬
└─ 鳴く() → 「ワン!」
猫
└─ 鳴く() → 「ニャー!」
犬も猫も「鳴く」という操作を持っていますが、実際の処理内容は異なります。
このように、
スーパークラスで定義された操作を、サブクラス側で再定義すること
をオーバーライドといいます。
したがって、選択肢イが正解です。
各選択肢の解説
ア:誤り
クラス間の関連は,二つのクラス間でだけ定義できる。
これは誤りです。
UMLの関連には、2つのクラスの間だけでなく、3つ以上の分類子が参加するn項関連もあります。
したがって、
「関連は必ず二つのクラス間だけで定義される」
という説明は正しくありません。
試験では「関連=2クラス限定」と覚えないように注意しましょう。
イ:正しい
サブクラスではスーパークラスの操作を再定義することができる。
これは正しいです。
サブクラスは、スーパークラスから継承した操作を必要に応じて再定義できます。
これがオーバーライドです。
ウ:誤り
サブクラスのインスタンスが,スーパークラスで定義されている操作を実行するときは,スーパークラスのインスタンスに操作を依頼する。
これは誤りです。
サブクラスのインスタンスは、スーパークラスから継承した操作を自分自身の操作として利用できます。
別のスーパークラスのインスタンスを作り、
「この処理をお願いします」
と依頼する仕組みではありません。
図にすると、
スーパークラス
↓ 継承
サブクラス
サブクラスのインスタンス
↓
継承した操作を利用
というイメージです。
他のオブジェクトに処理を任せる考え方は「委譲」と呼ばれることがありますが、今回の選択肢は継承の説明としては不適切です。
エ:誤り
集約オブジェクトは部分となるオブジェクトと,属性及び操作を共有する。
これは誤りです。
集約は、
「全体」と「部分」
を表す関係です。
例えば、モデルによっては、
組織
└─ メンバー
のような関係を全体―部分関係として表すことがあります。
しかし、集約だからといって、
- 属性を共有する
- 操作を共有する
- 継承する
というわけではありません。
集約は、あくまで全体と部分の関係を表します。
図で整理するクラス間の関係
代表的な関係を整理すると、次のようになります。
| 関係 | 意味 | 例 |
| 継承 | 上位クラスの性質や操作を引き継ぐ | 犬は動物である |
| 関連 | クラス同士に意味のあるつながりがある | 顧客と注文 |
| 集約 | 全体と部分の関係 | 組織とメンバー |
| オーバーライド | 継承した操作をサブクラスで再定義する | 動物の「鳴く」を犬で再定義 |
ここで特に注意したいのが、
集約=単純に「has-a」と完全一致するわけではない
という点です。
入門書では「has-a」と説明されることがありますが、UMLでは全体―部分関係として理解する方が正確です。
問題の用語解説
クラス
クラスとは、オブジェクトが持つ
- 属性
- 操作
をまとめて定義したものです。
例えば「犬」というクラスなら、
犬
属性
・名前
・年齢
操作
・走る()
・鳴く()
といった形で定義できます。
クラスはいわば、オブジェクトを作るための設計図です。
インスタンス
クラスをもとに実際に生成された具体的なオブジェクトをインスタンスといいます。
犬クラス
↓
ポチ
↓
ハチ
「犬」という設計図から作られた「ポチ」「ハチ」がインスタンスです。
スーパークラス
継承関係における上位側のクラスです。
「親クラス」と呼ばれることもあります。
例えば、
動物
をスーパークラスとして、
犬
猫
などをサブクラスとして定義できます。
サブクラス
スーパークラスを継承して作られるクラスです。
スーパークラスの性質や操作を引き継ぎながら、独自の機能を追加できます。
動物
↑
犬
という場合、「犬」がサブクラスです。
継承
スーパークラスの性質や操作を、サブクラスが引き継ぐ仕組みです。
イメージとしては、
犬は動物である
というis-a関係で説明されることが多いです。
オーバーライド
スーパークラスで定義された操作を、サブクラス側で再定義することです。
動物
└─ 鳴く()
犬
└─ 鳴く() → ワン!
猫
└─ 鳴く() → ニャー!
今回の問題では、この考え方が正解につながります。
関連
関連とは、クラス同士の意味のあるつながりを表します。
例えば、
顧客 ─ 注文
のような関係です。
関連は必ず2つのクラスだけに限定されるわけではなく、3つ以上の要素が参加する関連も表現できます。
集約
集約とは、関連の一種で、
全体―部分関係
を表します。
全体
└─ 部分
というイメージです。
ただし、どの関係を集約としてモデル化するかは、対象となるシステムの設計によって変わる場合があります。
「車とタイヤ」「会社と社員」のような例がよく使われますが、これらが常に必ず集約になるわけではありません。
体系的位置づけ
今回の問題は、応用情報技術者試験の
テクノロジ系
└─ システム開発技術
└─ ソフトウェア方式設計・詳細設計
└─ オブジェクト指向設計
に位置づけられる内容です。
オブジェクト指向設計では、
- クラス
- スーパークラス
- サブクラス
- 継承
- 関連
- 集約
- 多相性
などが重要な用語となります。
今回の問題の重要ポイント
今回の問題で押さえておきたいポイントは、次の4つです。
① サブクラスは操作を再定義できる
スーパークラス
↓ 継承
サブクラス
↓
操作を再定義
これがオーバーライドです。
② 継承は「is-a」で考える
犬は動物である
という関係は、継承を理解する典型的な例です。
③ 集約は「全体―部分関係」
集約を単純に
has-a
だけで覚えるのではなく、
全体
└─ 部分
という関係で理解しておきましょう。
④ 継承と委譲を混同しない
継承では、サブクラスのインスタンスが継承した操作を利用できます。
サブクラス
↓
継承した操作を使う
一方、委譲では別のオブジェクトに処理を任せます。
オブジェクトA
↓ 処理を依頼
オブジェクトB
今回の選択肢ウは、この違いを狙ったひっかけと考えることができます。
試験で間違えやすいポイント
| 間違えやすい理解 | 正しい理解 |
| 関連は2クラス限定 | 3つ以上が参加する関連もある |
| 集約=継承 | 集約と継承は別の関係 |
| 集約=必ずhas-a | 正確には全体―部分関係 |
| サブクラスは親オブジェクトに処理を依頼する | 継承した操作を自分自身の操作として利用できる |
| オーバーライド=新しい操作を追加すること | 継承した操作を再定義すること |
まとめ
今回の問題では、オブジェクト指向におけるクラス間の関係について問われました。
正解は、
イ:サブクラスではスーパークラスの操作を再定義することができる
です。
この再定義をオーバーライドと呼びます。
今回特に覚えておきたいのは、
継承
→ 上位クラスの性質や操作を引き継ぐ
オーバーライド
→ 継承した操作を再定義する
関連
→ クラス同士の意味のあるつながり
集約
→ 全体と部分の関係
という違いです。
オブジェクト指向は用語だけを見ると難しく感じますが、
「犬は動物である」
「全体と部分の関係である」
といった具体例に置き換えると、一気に理解しやすくなります。
単語だけを暗記するのではなく、クラス同士がどのようにつながっているのかを図でイメージして覚えていきましょう。

コメント