多相性を実現するオーバーライドとは?似た用語との違い
基本情報技術者試験 平成29年度秋期 午前 問7 / アルゴリズムとプログラミング › プログラミング
過去問にチャレンジ
オブジェクト指向プログラミングにおける,多相性を実現するためのオーバーライドの説明はどれか。
- ア
オブジェクト内の詳細な仕様や構造を外部から隠蔽すること
- イ
スーパークラスで定義されたメソッドをサブクラスで再定義すること
- ウ
同一クラス内に,メソッド名が同一で,引数の型,個数,並び順が異なる複数のメソッドを定義すること
- エ
複数のクラスの共通する性質をまとめて,抽象化したクラスを作ること
会話形式の解説
講師今回はオブジェクト指向の用語問題です。オーバーライドの説明を選びますが、選択肢にはカプセル化、オーバーロード、汎化の説明も並んでいます。それぞれの説明がどの用語にあたるかを当てはめていきましょう。
受験者オーバーライドとオーバーロードは名前が似ていて、どちらがどちらだったか、いつも迷ってしまいます。
講師見分けるには、説明の中に上位クラスと下位クラスの関係が出てくるかを確かめます。オーバーライドは継承、つまり上位クラスの性質を下位クラスが受け継ぐ関係が前提です。そのうえで、上位クラスのメソッドを下位クラスで定義し直すことを指します。
受験者それなら、スーパークラスのメソッドをサブクラスで再定義する、という選択肢がぴったりです。
講師そのとおりです。問題文にある多相性とのつながりも確認しておきましょう。多相性(ポリモーフィズム)は、同じメッセージを送っても、受け取ったオブジェクトによって違う処理が行われる性質です。
受験者サブクラスごとにメソッドの中身を変えておけば、同じ呼び出し方でもクラスによって動きが変わる、ということですね。だから多相性を実現する仕組みになるのですね。
講師はい。では、同じクラスの中に、名前が同じで引数の型・個数・並び順が違うメソッドを複数定義する、という選択肢はどうでしょうか。
受験者そちらがオーバーロードですね。「同一クラス内」と書いてあって、上位と下位のクラスの関係が出てこないので、オーバーライドではないと判断できます。
講師よく見分けられています。残りの二つも確かめましょう。オブジェクト内部の詳細な仕様や構造を外部から隠す、という説明は何にあたりますか。
受験者カプセル化、情報隠蔽のことだと思います。メソッドを定義し直す話は出てきません。もう一つの、共通する性質をまとめて抽象化したクラスを作る、というのは継承に関係がありそうで少し迷います。
講師迷うのは自然です。それは汎化といって、複数のクラスに共通する性質をまとめて上位クラスを作る考え方です。クラスの階層を作る話であり、できた上位クラスのメソッドを下位で定義し直す操作ではありません。
受験者階層を作るのが汎化で、その階層の中で下位クラスがメソッドを作り直すのがオーバーライド、と分けて考えればいいのですね。
講師そうです。最後に覚え方をまとめます。「継承関係の上下で再定義する」のがオーバーライド、「同じクラスの中で引数を変えて並べる」のがオーバーロードです。あわせて、内部を外から隠すのがカプセル化、共通の性質をまとめて上位クラスを作るのが汎化、と整理しておくと区別しやすくなります。
まとめ
オーバーライドとは、スーパークラス(上位クラス)で定義されたメソッドをサブクラス(下位クラス)で定義し直すことです。サブクラスごとに動作を変えられるので、同じメッセージを送っても受け取ったオブジェクトによって違う処理が行われます。こうして多相性が実現されます。名前が似ているオーバーロードは、同じクラスの中で名前が同じで引数の違うメソッドを複数定義することで、継承関係を前提としません。内部を外から隠すのはカプセル化、共通の性質をまとめて上位クラスを作るのは汎化です。
解答・解説
正解はイです
この問題のテーマ
オブジェクト指向プログラミングで多相性を実現する仕組みのうち、「オーバーライド」が何を指すかを問う問題です。似た用語のカプセル化・オーバーロード・汎化と区別できるかが問われています。
解き方の考え方
まず、オーバーライドは継承関係を前提にして、上位クラスのメソッドを下位クラスで定義し直すことだと押さえます。次に、各選択肢がどの用語の説明なのかを一つずつ当てはめます。説明の中に「スーパークラスとサブクラス」の関係が出てくるか、「同一クラス内」の話なのかに注目すると見分けやすくなります。
選択肢ごとの解説
- ×ア オブジェクト内の詳細な仕様や構造を外部から隠蔽することオブジェクトの内部の仕様や構造を外から見えなくするという説明は、カプセル化(情報隠蔽)にあたります。この説明はメソッドを定義し直すことには触れていないため、オーバーライドの説明ではありません。
- ○イ スーパークラスで定義されたメソッドをサブクラスで再定義することスーパークラスのメソッドをサブクラスで再定義するという説明は、オーバーライドの定義そのものです。サブクラスごとに動作を変えられるので、同じメッセージを送っても、受け取ったオブジェクトの種類によって違う処理が行われます。こうして多相性が実現されます。
- ×ウ 同一クラス内に,メソッド名が同一で,引数の型,個数,並び順が異なる複数のメソッドを定義すること同じクラスの中に、名前が同じで引数の型・個数・並び順が違うメソッドを複数定義するという説明は、オーバーロードにあたります。上位クラスと下位クラスの関係を前提としていない点で、オーバーライドとは違います。
- ×エ 複数のクラスの共通する性質をまとめて,抽象化したクラスを作ること複数のクラスに共通する性質をまとめて上位のクラスを作るという説明は、汎化にあたります。これはクラス階層を作る考え方であり、できたクラスのメソッドを下位で定義し直す操作ではありません。
補足
オーバーライドとオーバーロードは名前が似ているため、取り違えやすい組み合わせです。「継承関係の上下で再定義する」のがオーバーライド、「同じクラスの中で引数を変えて並べる」のがオーバーロード、と覚えておくと区別しやすくなります。
POINT
- オーバーライドは、上位クラスのメソッドを下位クラスで再定義することです。
- 多相性(ポリモーフィズム)は、同じメッセージでもオブジェクトによって異なる処理が行われる性質で、オーバーライドによって実現されます。
- オーバーロードは、同じクラスの中で名前が同じで引数が異なるメソッドを複数定義することで、オーバーライドとは別のものです。
- 内部を外から隠すのはカプセル化、共通の性質をまとめて上位クラスを作るのは汎化です。
