• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:オブジェクト指向 継承について)

オブジェクト指向継承について

このQ&Aのポイント
  • オブジェクト指向を勉強中のPHP初心者が、継承についての理解に困っています。
  • 質問プログラムの予想では、体重が20キロ減るごとに死亡すると思われます。
  • また、return;は戻り値を返す役割を持ち、複雑な場合には意味がわからなくなることがあります。

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

  • ベストアンサー
  • kalkichi
  • ベストアンサー率64% (22/34)
回答No.1

元体重の0.99%を切った時点で死ぬので後の処理(walking)をさせない為にreturn;でfunctionを抜けてます。

nicoko
質問者

補足

解答ありがとうございます。この例題のreturnについての理解は完璧とはいえませんが、どういう時につかうのかは理解できました。 ありがとうございます。 実は、書き方不足でもうしわけないのですが、 例題の答えが (1)$animal->walk(5, 2); (2)$animal->walk(-10, 20); (3)$animal->walk(2, 0); (4)$animal->walk(-50, 21); (5)$animal->walk(-11, -20); (6)$animal->walk(20, 30); (7)$animal->get_weight(); (8)$animal->get_posi();        ↓ (1)walking... [5], [2] (2)walking... [-10], [20] (3)walking... [2], [0] (4)walking... [-50], [21] (5)I died... (6)Weight... 5920 g (7)Position... x : -53, y : 43  になります。 予想していた答えが (1)と(2)は解答と同じ (3)~(6)I died... (7)Position... x : -5, y : 22   でした。 (1)の解き方は function walk($x, $y){ if(!$this->soul){ return; } if($this->weight < $this->first_weight * 0.6){ $this->death(); return; } $this->x += $x; 5を代入 $this->y += $y; 2を代入  echo "walking... [{$x}], [{$y}]<br />"; $this->weight -= 20; 6000-20=5980 ここ間違っている部分をどのように考えたらよいのか教えていただけませんでしょうか? 宜しくお願いします。

その他の回答 (2)

  • kalkichi
  • ベストアンサー率64% (22/34)
回答No.3

> 解釈はあっているでしょうか? OKです。 念のため、正確にはget_posi()は現在の位置を出力するメソッドなので位置情報は $this->x += $x; $this->y += $y; で蓄積しています。 私見ですが、class ANIMALのメンバとしてwalk()やdeath()は動物の動作ですが、get_weight()、get_posi()は状態を画面に出力させる為だけのメソッドで動物の動作を表現していないので、class ANIMALに並べるのは不自然だと思います。 get_weight()、get_posi()はバッサリカットして $animal = new ANIMAL(6000); $animal->walk(5, 2); (省略) echo "Weight... {$animal->weight} g<br />"; echo "Position... x : {$animal->x}, y : {$animal->y}"."<br />"; とするのがいいかな。と思いました。

nicoko
質問者

お礼

御礼遅くなって申し訳ありません。先ほど上記kalkichiさんに書いていただいたプログラムをみて書き換えましたところ。見ため的にもすっきりです。 そして、解釈もOKということでやっと問題自体も理解をすることができました。ありがとうございます。 自分の力だけでは解けなかったと思います。 何度も聞いて、そのたびに回答をいただけて本当に感謝しております。 ありがとうございました。

  • kalkichi
  • ベストアンサー率64% (22/34)
回答No.2

ご不明な点がいまいち把握できず質問意図と異なっていたら申し訳ないのですが、この場合 ・元の体重が6000 ・6000 * 0.99 = 5940以下になると死ぬ ・1回動くと-20 という事で、6000-5940=60 → 60÷20=3 で、3回動ける事になります。 ただし体重が減るのが全ての状態チェックが終わったあとなので、1回分余分に動けます。 動作(メソッド)のたびに状態(プロパティ)を確認してみれば把握しやすいと思います。 $animal->walk(5, 2); $animal->get_weight(); $animal->get_posi(); $animal->walk(-10, 20); $animal->get_weight(); $animal->get_posi(); $animal->walk(2, 0); $animal->get_weight(); $animal->get_posi(); $animal->walk(-50, 21); $animal->get_weight(); $animal->get_posi(); $animal->walk(-11, -20); $animal->get_weight(); $animal->get_posi(); $animal->walk(20, 30); $animal->get_weight(); $animal->get_posi();

nicoko
質問者

補足

説明が下手で本当に申し訳ありません。 上記の解答参考になりました。 3回動けることは理解していたのですが、 「体重が減るのが全ての状態チェックが終わったあとなので、1回分余分に動けます。」とても参考になりました。 function walkで歩いた位置、(5.2)を代入し、 echo でwalking...[5][2]を出力 この時点では(1)6000g function get_weight     この時点で5980g となると、 (1)6000 (2)5980 (3)5960 (4)5940 (5)I died... (6)I died...だけれど function walk($x, $y){ if(!$this->soul){ return; でfunction から抜けるので、出力されない (7)weight...5920 (8)Position... x : -53, y : 43 I died...がでた時点で if($this->weight < $this->first_weight * 0.99){ $this->death(); return; の部分でfunctionから抜けるので、 function get_posi(){ echo "Position... x : {$this->x}, y : {$this->y}"."<br />"; } に蓄積されない。 で解釈はあっているでしょうか? 長々と申し訳ないです。宜しくお願いします。

関連するQ&A