- ベストアンサー
スーパークラスとサブクラスについて
- スーパークラスとサブクラスの関係について説明します。
- ParentクラスとChildrenクラスを使った例を通して、pcオブジェクトの性質について説明します。
- pcオブジェクトはChildrenクラスのインスタンスであり、Parentクラスのメソッドを実行することができますが、Childrenクラスのメソッドは実行できません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Parent pc = ほにゃらら; と書いたとき、pc の実態がどうであれ pc は Parent としてふるまうことを要求されます。 つまりあなたも理解している通り、Parent を継承した Child に追加されたメソッドやプロパティは Parent に存在しないため利用できません。 しかし、要求されるのはメソッドの外から見た振る舞い(引数の数、各引数の型、戻り値の型)だけで、内部の処理まで同一であることは要求されません。 オーバーライドは和訳すると「決定などを覆す」という意味があります。 その意味通りに親クラスの処理内容を覆して別の処理にするのがオーバーライドという機構で、サブクラスの処理に切り替わらなくてはオーバーライドさせる意味がありません。 ですから、 > 同名のメソッド(オーバーライドされたメソッド)が親クラスにもサブクラスにも存在した場合、 > pc.getName()ではサブクラスのメソッドが呼ばれるというのがどうも腑に落ちないところです。 と言われても、オーバーライドとはそういうものだと飲み込んでもらうしかありません。 この辺りは言語仕様でそうなっているというよりはオブジェクト指向の特徴の一つである「多態性」を実現するためにそうなっていると思ってください。
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
「文法的に」というかなんというか. Parent 型の変数には「Parent クラスから派生した任意のクラスのオブジェクト」を入れることができる. あたりまえだけど, その「Parent クラスから (以下省略)」のオブジェクトとして「Parent クラスのオブジェクト」をとることもできる. でも, Parent クラスのオブジェクトに対して「Children クラスにしかないメソッド」は呼び出せないでしょ?
補足
Parent pc = new Children(); pc.getName(); とあったときpcオブジェクトはParentクラスのオブジェクト なのでChildrenクラスにしかないメソッドが呼べないのは わかるのですが同名のメソッド(オーバーライドされた メソッド)が親クラスにもサブクラスにも存在した場合、 pc.getName()ではサブクラスのメソッドが呼ばれると いうのがどうも腑に落ちないところです。
- notnot
- ベストアンサー率47% (4900/10358)
変数pcはParentクラス型なので、Parentクラスにないメソッドは呼べません。 ParentクラスとChildrenクラスの両方にある同名のメソッドのどちらが呼ばれるかは、pcに格納されているオブジェクトのクラスによります。new Parent()で作ったものか、new Children() で作った物かによって違う。 Childrenクラスにしかないメソッドを呼ぶには、そのオブジェクトをChildrenクラス型の変数に格納する必要があります。
補足
ご回答ありがとうございます。 文法的にそういうものなんですね。 頭に叩き込みたいと思います。
お礼
>>オーバーライドは和訳すると「決定などを覆す」という意味があります。 そんな意味があったのですね。これでしっくりきました。 決定を覆してオーバーライドされたものを実行するのですね。ご回答ありがとうございました。