Abstraktné metódy v OOP v PHP
Abstraktné triedy môžu obsahovať aj abstraktné metódy. Takéto metódy by nemali mať implementáciu, ale slúžia na to, aby určili, že takéto metódy musia mať potomkovia. A samotná implementácia týchto metód - je už úlohou potomkov.
Na to, aby sme deklarovali metódu ako abstraktnú,
pri jej deklarácii musíme napísať kľúčové
slovo abstract.
Skúsme to v praxi. Predpokladajme,
že všetci potomkovia triedy User musia
mať metódu increaseRevenue.
Táto metóda by mala zobrať aktuálny príjem používateľa a zvýšiť ho o určitú hodnotu, odovzdanú ako parameter.
Samotná trieda User nevie, aký presne
príjem bude mať potomok - veď u zamestnanca
je to plat, a u študenta - štipendium. Preto
každý potomok bude implementovať túto metódu
inak.
Podstata je v tom, že abstraktná metóda triedy
User núti programátora implementovať
túto metódu v potomkoch, inak PHP vyhodí chybu.
Takto vy, alebo iný programátor,
ktorý pracuje s vaším kódom, v žiadnom prípade nemôžete
zabudnúť implementovať požadovanú metódu
v potomkovi.
Poďme to vyskúšať v praxi. Pridajme
abstraktnú metódu increaseRevenue
do triedy User:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
// Abstraktná metóda bez tela:
abstract public function increaseRevenue($value);
}
?>
Nechajme našu triedu Employee zatiaľ
bez zmien. V tomto prípade, aj keď nevytvoríme
objekt triedy Employee,
ale iba spustíme kód, v ktorom sú definované
naše triedy - PHP vyhodí chybu.
Teraz napíšme implementáciu metódy
increaseRevenue v triede
Employee:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
// Napíšme implementáciu metódy:
public function increaseRevenue($value)
{
$this->salary = $this->salary + $value;
}
}
?>
Skontrolujme fungovanie našej triedy:
<?php
$employee = new Employee;
$employee->setName('john');
$employee->setSalary(1000);
$employee->increaseRevenue(100);
echo $employee->getSalary();
?>
Implementujme metódu increaseRevenue aj
v triede Student. Lenže teraz naša
metóda bude zvyšovať už štipendium:
<?php
class Student extends User
{
private $scholarship; // štipendium
public function getScholarship()
{
return $this->scholarship;
}
public function setScholarship($scholarship)
{
$this->scholarship = $scholarship;
}
// Metóda zvyšuje štipendium:
public function increaseRevenue($value)
{
$this->scholarship = $this->scholarship + $value;
}
}
?>
Pridajte do vašej triedy User rovnakú
abstraktnú metódu increaseRevenue.
Napíšte implementáciu tejto metódy v triedach
Employee a Student.
V triede Figure vytvorte abstraktné
metódy na získanie obsahu a obvodu útvaru.