• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:スーパークラスとサブクラスについて)

スーパークラスとサブクラスについて

このQ&Aのポイント
  • スーパークラスとサブクラスの関係について説明します。
  • ParentクラスとChildrenクラスを使った例を通して、pcオブジェクトの性質について説明します。
  • pcオブジェクトはChildrenクラスのインスタンスであり、Parentクラスのメソッドを実行することができますが、Childrenクラスのメソッドは実行できません。

質問者が選んだベストアンサー

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.3

 Parent pc = ほにゃらら; と書いたとき、pc の実態がどうであれ pc は Parent としてふるまうことを要求されます。 つまりあなたも理解している通り、Parent を継承した Child に追加されたメソッドやプロパティは Parent に存在しないため利用できません。 しかし、要求されるのはメソッドの外から見た振る舞い(引数の数、各引数の型、戻り値の型)だけで、内部の処理まで同一であることは要求されません。 オーバーライドは和訳すると「決定などを覆す」という意味があります。 その意味通りに親クラスの処理内容を覆して別の処理にするのがオーバーライドという機構で、サブクラスの処理に切り替わらなくてはオーバーライドさせる意味がありません。 ですから、 > 同名のメソッド(オーバーライドされたメソッド)が親クラスにもサブクラスにも存在した場合、 > pc.getName()ではサブクラスのメソッドが呼ばれるというのがどうも腑に落ちないところです。 と言われても、オーバーライドとはそういうものだと飲み込んでもらうしかありません。 この辺りは言語仕様でそうなっているというよりはオブジェクト指向の特徴の一つである「多態性」を実現するためにそうなっていると思ってください。

unko347
質問者

お礼

>>オーバーライドは和訳すると「決定などを覆す」という意味があります。 そんな意味があったのですね。これでしっくりきました。 決定を覆してオーバーライドされたものを実行するのですね。ご回答ありがとうございました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「文法的に」というかなんというか. Parent 型の変数には「Parent クラスから派生した任意のクラスのオブジェクト」を入れることができる. あたりまえだけど, その「Parent クラスから (以下省略)」のオブジェクトとして「Parent クラスのオブジェクト」をとることもできる. でも, Parent クラスのオブジェクトに対して「Children クラスにしかないメソッド」は呼び出せないでしょ?

unko347
質問者

補足

Parent pc = new Children(); pc.getName(); とあったときpcオブジェクトはParentクラスのオブジェクト なのでChildrenクラスにしかないメソッドが呼べないのは わかるのですが同名のメソッド(オーバーライドされた メソッド)が親クラスにもサブクラスにも存在した場合、 pc.getName()ではサブクラスのメソッドが呼ばれると いうのがどうも腑に落ちないところです。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

変数pcはParentクラス型なので、Parentクラスにないメソッドは呼べません。 ParentクラスとChildrenクラスの両方にある同名のメソッドのどちらが呼ばれるかは、pcに格納されているオブジェクトのクラスによります。new Parent()で作ったものか、new Children() で作った物かによって違う。 Childrenクラスにしかないメソッドを呼ぶには、そのオブジェクトをChildrenクラス型の変数に格納する必要があります。

unko347
質問者

補足

ご回答ありがとうございます。 文法的にそういうものなんですね。 頭に叩き込みたいと思います。

関連するQ&A