Absztrakt metódusok az OOP-ban PHP-ben

Az absztrakt osztályok tartalmazhatnak absztrakt metódusokat is. Az ilyen metódusoknak nem szabad implementációval rendelkezniük, hanem azért szolgálnak, hogy jelezzék, hogy az ilyen metódusoknak a leszármazottaknál is jelen kell lenniük. Maguknak az ilyen metódusok implementálása már a leszármazottak feladata.

Ahhoz, hogy egy metódust absztraktnak nyilvánítsunk, a deklarációjakor a abstract kulcsszót kell használni.

Próbáljuk ki a gyakorlatban. Tegyük fel, hogy az összes User osztályból származó osztálynak rendelkeznie kell egy increaseRevenue metódussal.

Ennek a metódusnak a felhasználó jelenlegi jövedelmét kell vennie, és egy paraméterként átadott értékkel növelnie kell azt.

Maga a User osztály nem tudja, hogy a leszármazott pontosan milyen jövedelemmel fog rendelkezni - hiszen egy alkalmazott esetében ez a fizetés, egy diák esetében pedig az ösztöndíj. Ezért minden leszármazott saját módon fogja implementálni ezt a metódust.

A lényeg az, hogy a User osztály absztrakt metódusa kényszeríti a programozót, hogy implementálja ezt a metódust a leszármazottakban, különben a PHP hibát jelez. Így te, vagy egy másik programozó, aki a kódoddal dolgozik, esélye sem lesz elfelejteni a szükséges metódus implementálását a leszármazottban.

Nos, próbáljuk ki a gyakorlatban. Adjuk hozzá az increaseRevenue absztrakt metódust a User osztályhoz:

User.php<?php
  abstract class User
  {
    private $name;
    
    public function getName()
    {
      return $this->name;
    }
    
    public function setName($name)
    {
      $this->name = $name;
    }
    
    // Absztrakt metódus implementáció nélkül:
    abstract public function increaseRevenue($value);
  }
?>

Tegyük fel, hogy a Employee osztályunk egyelőre változatlan marad. Ebben az esetben, még ha nem is hozunk létre Employee osztályú objektumot, hanem csak futtatjuk az osztályainkat definiáló kódot, - a PHP hibát fog jelezni.

Most írjuk meg a increaseRevenue metódus implementációját a Employee osztályban:

Employee.php<?php
  class Employee extends User
  {
    private $salary;
    
    public function getSalary()
    {
      return $this->salary;
    }
    
    public function setSalary($salary)
    {
      $this->salary = $salary;
    }
    
    // Írjuk meg a metódus implementációját:
    public function increaseRevenue($value)
    {
      $this->salary = $this->salary + $value;
    }
  }
?>

Ellenőrizzük az osztályunk működését:

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

Implementáljuk a increaseRevenue metódust a Student osztályban is. Csak most a metódusunk az ösztöndíjat fogja növelni:

Student.php<?php
  class Student extends User
  {
    private $scholarship; // ösztöndíj
    
    public function getScholarship()
    {
      return $this->scholarship;
    }
    
    public function setScholarship($scholarship)
    {
      $this->scholarship = $scholarship;
    }
    
    // A metódus növeli az ösztöndíjat:
    public function increaseRevenue($value)
    {
      $this->scholarship = $this->scholarship + $value;
    }
  }
?>
Задание 1

Adja hozzá a User osztályához ugyanezt az absztrakt increaseRevenue metódust. Írja meg ennek a metódusnak az implementációját a Employee és Student osztályokban.

Задание 2

A Figure osztályban készítsen absztrakt metódusokat az alakzat területének és kerületének megkapásához.