継承・オーバーライド・抽象・ポリモーフィズムについて

2021/12/19

PHPにはクラスの継承という仕組みがあります。

既にあるクラスをベースにして、それを更に拡張したクラスを作る仕組みです。

【構文】
class サブクラス名 extends スーパークラス名
{

}

Laravelでもコントローラやモデルで継承の仕組みを利用しています。

理解しておくとさらにLaravelの知識が深まると思います。

 

シナリオ

継承する基のクラスをスーパークラス(もしくは親クラス)と呼びます。

継承して新たに作られるクラスをサブクラス(もしくは子クラス)と呼びます。

継承を理解するために用意したチュートリアルでは

【1】Guitarクラス(スーパークラス)の作成

【2】Electricクラス、Acousticクラス(サブクラス)の作成

【3】オーバーライド

【4】抽象 (abstract)

【5】ポリモーフィズム

というシナリオで進めていきます。

 

【1】Guitarクラス(スーパークラス)の作成

まず、ギタークラスを作成してplayメソッドをつくります。

Class Guitar{
  public function play(){
  echo "ジャカジャカジャカ♪";
  }
}

$guitar = new Guitar();
$guitar->play();

出力結果

 

【2】Electricクラス、Acousticクラス(サブクラス)の作成

次に先ほど作成したギタークラスをベースにしてサブクラスを作成してみます。

Class Guitar{
    public function play(){
        echo "ジャカジャカジャカ♪<br>";
    }
}

class Electric extends Guitar {}
class Acoustic extends Guitar {}

$electric = new Electric();
echo "エレキギター:";
$electric->play();

$acoustic = new Acoustic();
echo "アコースティックギター:";
$acoustic->play();

Guitarクラスを継承してElectricクラスとAcousticクラスを作成しました。

このようにGuitarクラスを継承しているのでplayメソッドを書かなくてもスーパークラスのplayメソッドを利用することができます。

しかし出力結果を見てみるとElectricクラスもAcousticクラスも同じスーパークラスのplayメソッドを利用しているので同じ「ジャカジャカジャカ♪」という音色になります。

次にスーパークラスのplayメソッドをElectricクラス、Acousticクラスごとに書きかえて(オーバーライド)音色を変えてみます。

 

【3】オーバーライド

スーパークラス(Guitar class)のplayメソッドを書きかえます。

これをオーバーライドと言います。

class Guitar{
  public function play(){
  echo "ジャカジャカジャカ♪<br>";
  }
}

class Electric extends Guitar{
  public function play(){
  echo "テケテケテケテケテケ♪<br>";
  }
}

class Acoustic extends Guitar{
  public function play(){
  echo "ポロンポロンポロンポロン♪<br>";
  }
}

$electric = new Electric();
echo "エレキギター:";
$electric->play();

$acoustic = new Acoustic();
echo "アコースティック:";
$acoustic->play();

出力結果は以下のようになります。

これでクラスごとに音色を変えることができました。

 

【4】抽象 (abstract)

先ほど作成したプログラムを見ての通り、各サブクラスごとにplayメソッドを作成したのでスーパークラス(Guitar class)のplayメソッドの「 ジャカジャカジャカ♪ 」という音色は必要なくなります。

しかし、playメソッド自体をなくすのではなく、「ギターは演奏するもの」という定義は残しておきたい。

こういうときに便利なのが抽象クラス・抽象メソッドという考えです。

【構文】
abstract class スーパークラス名
{
// 抽象メソッド
abstract アクセス修飾子 function メソッド名();
}

抽象クラスはインスタンスを生成できません。

つまり必ず継承して使用することになります。

それでは先ほどのソースコードのスーパークラスを書きかえてみます。

abstract class Guitar{
  abstract protected function play();
}
 :
【解説】
抽象メソッドの中身は何も記述しません。

 

【5】ポリモーフィズム

作成したソースを確認するとElectricサブクラスとAcousticサブクラスでは同じplayメソッドを実装しています。

このようにクラスは異なっても同じ名前のメソッドでいろんな動きを実現させる事をポリモーフィズムと呼びます。

日本語では多様性とかに訳されます。

 
以上です。

PHP おススメ教材(by Udemy)

 

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-周辺知識