継承

今更感満載

継承 (extends) とはなんぞ

すでに定義されたクラスの機能を引き継いで、新しいクラスを定義することを
継承 ( extends ) と言います。

なんで継承するの?

まだまだよく分かってないけど、例えば

  • 似たような内容なんだけど、ちょこっと違う仕様

そんな時に、継承したクラスを作ると便利じゃね!って話かなと。

それならコピペで作ればいいんじゃね?

とも思ったら、例えば

  • 元のコードとコピペコード共通で重複してる箇所にちょっとした変更があった場合 とか

元のコードをコピペして作った場合、コピペ元も、コピペして作成したコードもどっちも修正しなくちゃならん!ってことになると。
これがコピペコードが1個ならまだKIAIで乗り切れるけども、10個以上作成してた場合はKIAIで乗り切れる気がしなくなってくると。

継承でも同じなんじゃね?

と思ったら、どうもそこら辺はよく出来てるらしい。
きたない。さすが継承きたない。

php で書くとこうなるらし

親クラス、スーパークラス

  3 class Product {
  4     protected $name;
  5     protected $price;
  6
  7     public function __construct($name) {
  8         $this->name = $name;
  9     }
 10
 11     public function setPrice($price) {
 12         $this->price = $price;
 13     }
 14
 15     public function getPrice() {
 16         return $this->price;
 17     }
 18 }

継承クラス、子クラス

 20 class FoodProduct extends Product {
 21     private $expire;
 22
 23     public function setExpire($expire) {
 24         $this->expire = $expire;
 25     }
 26
 27     public function getExpire() {
 28         return $this->expire;
 29     }
 30
 31     public function getName() {
 32         return $this->name;
 33     }
 34 }

継承クラスを実体化、インスタンス生成

 36 $food = new FoodProduct('肉');
 37 $food->setExpire(100);
 38 echo '価格を' . $food->getExpire() . '円に設定しました。';
 39
 40 $food->setExpire(30);
 41 echo '賞味期限を' . $food->getExpire() . '日に設定しました。';
 42
 43 echo '商品は' . $food->getName() . 'です。';

実行結果

価格を100円に設定しました。 賞味期限を30日に設定しました。 商品は肉です。

継承クラスには書かれてない setPrice(), getPrice() メソッドの実行も継承してるからできるよ!
継承元クラスのプロパティも参照できるよ!
もしsetPrice(), getPrice() の内容が変わっても、継承元クラスを書き換えれば継承クラスすべてに反映されるよ!

ってなところが、オブジェクト指向で継承が重要と言われる理由なのかなと最近やっとひとつ学びました。


継承元クラスが書き換わったら折角いい塩梅だった、継承先クラスの内容が変わっちまったじゃねーかどーしてくれるんだバカー!
って状態になった時の為に、偉い人は言ったとか言わないとか。


You オーバーライド しちゃいなよ。 次回へ続く。続いたらいいな