PHPにおけるオブジェクト指向プログラミングの抽象メソッド

抽象クラスは抽象メソッドを含むこともできます。そのようなメソッドは実装を持つべきではなく、子孫クラスがそのようなメソッドを持つべきであることを示すために必要です。そして、実際にそのようなメソッドを実装することは、子孫クラスの課題です。

メソッドを抽象的に宣言するには、その宣言時にキーワードabstractを記述します。

実際に試してみましょう。Userクラスの全ての子孫クラスは、increaseRevenueメソッドを持つ必要があると想定します。

このメソッドは、ユーザーの現在の収入を取得し、パラメーターとして渡された値だけ増やす必要があります。

Userクラス自体は、継承クラスがどのような収入を得るか知りません。従業員の場合は給料であり、学生の場合は奨学金だからです。したがって、各子孫クラスはこのメソッドを独自の方法で実装します。

ここでの本質は、Userクラスの抽象メソッドが、プログラマーに子孫クラスでこのメソッドを実装することを強制することです。そうしないとPHPはエラーを出力します。このようにして、あなたやあなたのコードを扱う他のプログラマーは、子孫クラスで必要なメソッドを実装することを決して忘れることができなくなります。

では、実際に試してみましょう。Userクラスに抽象メソッドincreaseRevenueを追加しましょう:

User.php<?php
  abstract class User
  {
    private $name;
    
    public function getName()
    {
      return $this->name;
    }
    
    public function setName($name)
    {
      $this->name = $name;
    }
    
    // 本体のない抽象メソッド:
    abstract public function increaseRevenue($value);
  }
?>

Employeeクラスは、今のところ変更を加えないことにします。この場合、Employeeクラスのオブジェクトを作成しなくても、単にクラスを定義するコードを実行するだけで、PHPはエラーを出力します。

では、EmployeeクラスでincreaseRevenueメソッドの実装を書きましょう:

Employee.php<?php
  class Employee extends User
  {
    private $salary;
    
    public function getSalary()
    {
      return $this->salary;
    }
    
    public function setSalary($salary)
    {
      $this->salary = $salary;
    }
    
    // メソッドの実装を記述します:
    public function increaseRevenue($value)
    {
      $this->salary = $this->salary + $value;
    }
  }
?>

クラスの動作を確認してみましょう:

index.php<?php
  $employee = new Employee;
  $employee->setName('john');
  $employee->setSalary(1000);
  $employee->increaseRevenue(100);
  
  echo $employee->getSalary();
?>

StudentクラスでもincreaseRevenueメソッドを実装しましょう。ただし、今回は私たちのメソッドは奨学金を増やします:

Student.php<?php
  class Student extends User
  {
    private $scholarship; // 奨学金
    
    public function getScholarship()
    {
      return $this->scholarship;
    }
    
    public function setScholarship($scholarship)
    {
      $this->scholarship = $scholarship;
    }
    
    // メソッドは奨学金を増やします:
    public function increaseRevenue($value)
    {
      $this->scholarship = $this->scholarship + $value;
    }
  }
?>
Задание 1

あなたのUserクラスに、同じ抽象メソッドincreaseRevenueを追加してください。 EmployeeクラスとStudentクラスで、このメソッドの実装を記述してください。

Задание 2

Figureクラスで、図形の面積と周囲長を取得するための抽象メソッドを作成してください。