Abstraktsed meetodid OOP-s PHP-s

Abstraktsed klassid võivad sisaldada ka abstraktsed meetodid. Sellistel meetoditel ei pea olema implementatsiooni, vaid need on vajalikud selleks, et näidata, et sellised meetodid peaksid olema järglastel. Ja tegelik selliste meetodite implementeerimine - on juba järglaste ülesanne.

Selleks, et deklareerida meetod abstraktsena, tuleb selle deklareerimisel kirjutada võtmesõna abstract.

Proovime praktiliselt. Oletame, et eeldatakse, et kõik klassi User järglased peaksid omama meetodit increaseRevenue.

See meetod peaks võtma kasutaja praeguse tulu ja suurendama seda mingi väärtuse võrra, mis edastatakse parameetrina.

Klass User ise ei tea, millist täpselt tulu järglane saab - sest töötajal on see palk, aga üliõpilasel - stipendium. Seetõttu iga järglane implementeerib selle meetodi omamoodi.

Asja iva on selles, et abstraktne meetod klassis User sunnib programmeerijat implementeerima selle meetodi järglastes, vastasel juhul annab PHP vea. Nii teie, või teine programmeerija, kes teie koodiga töötab, ei suuda kuidagi unustada vajaliku meetodi implementeerimist järglases.

Nii, proovime praktiliselt. Lisame abstraktse meetodi increaseRevenue klassi User:

User.php<?php
  abstract class User
  {
    private $name;
    
    public function getName()
    {
      return $this->name;
    }
    
    public function setName($name)
    {
      $this->name = $name;
    }
    
    // Abstraktne meetod ilma kehata:
    abstract public function increaseRevenue($value);
  }
?>

Olgu meie klass Employee jääb esialgu muutmata. Sel juhul, isegi kui ei loo klassi Employee objekti, vaid lihtsalt käivitada kood, kus defineeritakse meie klassid, - annab PHP vea.

Kirjutame nüüd meetodi increaseRevenue implementatsiooni klassis Employee:

Employee.php<?php
  class Employee extends User
  {
    private $salary;
    
    public function getSalary()
    {
      return $this->salary;
    }
    
    public function setSalary($salary)
    {
      $this->salary = $salary;
    }
    
    // Kirjutame meetodi implementatsiooni:
    public function increaseRevenue($value)
    {
      $this->salary = $this->salary + $value;
    }
  }
?>

Kontrollime meie klassi tööd:

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

Implementeerime meetodi increaseRevenue ka klassis Student. Ainult nüüd meie meetod suurendab juba stipendiumi:

Student.php<?php
  class Student extends User
  {
    private $scholarship; // stipendium
    
    public function getScholarship()
    {
      return $this->scholarship;
    }
    
    public function setScholarship($scholarship)
    {
      $this->scholarship = $scholarship;
    }
    
    // Meetod suurendab stipendiumi:
    public function increaseRevenue($value)
    {
      $this->scholarship = $this->scholarship + $value;
    }
  }
?>
Задание 1

Lisage oma klassi User samasugune abstraktne meetod increaseRevenue. Kirjutage selle meetodi implementatsioon klassidesse Employee ja Student.

Задание 2

Klassis Figure tehke abstraktsed meetodid kujundi pindala ja perimeetri saamiseks.