【問題】
オブジェクト指向におけるクラス間の関係のうち、適切なものはどれか。
【選択肢】
ア クラス間の関連は、二つのクラス間でだけ定義できる。
イ サブクラスではスーパークラスの操作を再定義することができる。
ウ サブクラスのインスタンスが、スーパークラスで定義されている操作を実行する
ときは、スーパークラスのインスタンスに操作を依頼する。
エ 二つのクラスに集約の関係がある時には、集約オブジェクトは部分となる
オブジェクトと、属性および操作を共有する。
2024年度(令和6年度)春期 高度試験午前Ⅰより引用
・・
・・
・・
・・
・・
【答え】
イ サブクラスではスーパークラスの操作を再定義することができる。
【解説】
オブジェクト指向プログラミングについての問題です。
オブジェクト指向プログラミングとは、オブジェクトと呼ばれる属性(プロパティ=設定値)と操作(メソッド=関数)の集合体を活用してプログラムを作成します。
車をオブジェクトに例えると、車の車体の色が属性、車が走る、ライトをつけるなどの機能が操作です。
プログラミングの世界であれば、例えば会計を行うプログラムのオブジェクトがあったとして、消費税率が8%といった設定値が属性、売上を集計するといった機能が操作です。
クラスとは、オブジェクト指向プログラミングにおいて、オブジェクトの設計図(オブジェクトの持っている属性と操作の定義情報)のことです。
クラス間の関係とは、いくつかのクラスとクラスの間の関係性のことを言い、「関連」、「汎化」、「集約」、「コンポジション」、「実現」、「依存」というパターンがあります。原則として、クラス間に何らかの関係がある場合は、どちらかがどちらかに包含されると考えてよいです(実際にはもっと複雑なパターンもあり得ます)。これは車というオブジェクトの中にエンジンというオブジェクトがあるのと同じようなイメージです。
サブクラスは、スーパークラスに内包されるクラス。スーパークラスは、サブクラスを内包するクラスを意味します。例えば、車(スーパークラス)の種類には、スポーツカー、消防車、救急車(サブクラス)といったより具体的で車の拡張した機能を持つようなクラスがあるようなイメージです。
集約とは、空港と飛行機のように、それぞれ独立して存在することができるが相互に関係がある状態のことを指します。
インスタンスとは、クラス(設計図)に基づいて、実体化したものです。車の設計図に基づいて製造した車本体のイメージです。
選択肢を1つ1つ吟味します。
「ア クラス間の関連は、二つのクラス間でだけ定義できる。」
→ クラス間の関連は複数のクラス間で定義できます。(車にはエンジンだけでなく、ハンドルやシートも定義できる)
「イ サブクラスではスーパークラスの操作を再定義することができる。」
→ 可能です。(車の設計図をベースに、MTをATにした設計図に上書きするようなイメージ)。サブクラスでスーパークラスの操作や属性を利用できることを「継承」。継承した操作や属性をサブクラスで再定義することを「オーバーライド」といいます。
「ウ サブクラスのインスタンスが、スーパークラスで定義されている操作を実行する
ときは、スーパークラスのインスタンスに操作を依頼する。」
→ サブクラスのインスタンスが構築される際に、スーパークラスの操作も備わっています。これは、消防車(サブクラス)が、車(スーパークラス)の一般的な機能である「走る」を最初から持っているのと同じです。
「エ 二つのクラスに集約の関係がある時には、集約オブジェクトは部分となる
オブジェクトと、属性および操作を共有する。」
→ 集約関係にある場合は、属性や操作を必ずしも共有しません。空港と飛行機は同じ機能を持たないのと同じイメージです。
よって、
「イ サブクラスではスーパークラスの操作を再定義することができる。」
が正解です。
