Абстрактыя метады ў ААП у PHP
Абстрактныя класы таксама могуць утрымліваць абстрактныя метады. Такія метады не павінны мець рэалізацыі, а патрэбныя для таго, каб паказаць, што такія метады павінны быць у нашчадкаў. А ўласна рэалізацыя такіх метадаў - ужо задача нашчадкаў.
Для таго, каб аб'явіць метад абстрактным,
пры яго аб'яўленні варта напісаць ключавое
слова abstract
.
Давайце паспрабуем на практыцы. Хай мяркуецца,
што ўсе нашчадкі класа User
павінны
мець метад increaseRevenue
.
Гэты метад павінен браць бягучы даход карыстальніка і павялічваць яго на некаторую велічыню, перададзеную параметрам.
Сам клас User
не ведае, які менавіта
даход будзе атрымліваць нашчаднік - бо ў работніка
гэта заробная плата, а ў студэнта - стыпендыя. Таму
кожны нашчадак будзе рэалізоўваць гэты метад
па-свойму.
Сутнасць тут у тым, што абстрактны метад класа
User
прымушае праграміста рэалізоўваць
гэты метад у нашчадкаў, інакш PHP выдас памылку.
Такім чынам вы, ці іншы праграміст,
які працуе з вашым кодам, ніяк не зможаце
забыцца рэалізаваць патрэбны метад
у нашчадку.
Такім чынам, давайце паспрабуем на практыцы. Дадамо
абстрактны метад increaseRevenue
у клас User
:
<?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 выдас памылку.
Давайце цяпер напішам рэалізацыю метада
increaseRevenue
у класе
Employee
:
<?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;
}
}
?>
Праверым працу нашага класа:
<?php
$employee = new Employee;
$employee->setName('john');
$employee->setSalary(1000);
$employee->increaseRevenue(100);
echo $employee->getSalary();
?>
Рэалізуем метад increaseRevenue
і
у класе Student
. Толькі цяпер наш
метад будзе павялічваць ужо стыпендыю:
<?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;
}
}
?>
Дадайце ў ваш клас User
такі ж
абстрактны метад increaseRevenue
.
Напішыце рэалізацыю гэтага метада ў класах
Employee
і Student
.
У класе Figure
зрабіце абстрактныя
метады для атрымання плошчы і перыметра фігуры.