Abstraktní metody v OOP v PHP
Abstraktní třídy mohou také obsahovat abstraktní metody. Takové metody by neměly mít implementaci, ale slouží k tomu, aby určily, že takové metody musí mít potomci. A vlastní implementace těchto metod - je již úkolem potomků.
Pro deklaraci abstraktní metody
je třeba při její deklaraci napsat klíčové
slovo abstract.
Pojďme to vyzkoušet v praxi. Předpokládejme,
že všichni potomci třídy User musí
mít metodu increaseRevenue.
Tato metoda by měla vzít aktuální příjem uživatele a zvýšit jej o určitou hodnotu předanou parametrem.
Samotná třída User neví, jaký přesně
příjem bude mít potomek - u zaměstnance
je to plat, zatímco u studenta - stipendium. Proto
každý potomek bude tuto metodu implementovat
svým vlastním způsobem.
Podstata spočívá v tom, že abstraktní metoda třídy
User nutí programátora implementovat
tuto metodu v potomcích, jinak PHP vypíše chybu.
Tímto způsobem vy, nebo jiný programátor,
pracující s vaším kódem, nemůžete
zapomenout implementovat požadovanou metodu
v potomkovi.
Pojďme to tedy vyzkoušet v praxi. Přidejme
abstraktní metodu increaseRevenue
do třídy User:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
// Abstraktní metoda bez těla:
abstract public function increaseRevenue($value);
}
?>
Nechme naši třídu Employee prozatím
beze změn. V tomto případě, i když
nevytváříme objekt třídy Employee,
ale pouze spustíme kód, ve kterém jsou definovány
naše třídy - PHP vypíše chybu.
Nyní napišme implementaci metody
increaseRevenue ve třídě
Employee:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
// Napíšeme implementaci metody:
public function increaseRevenue($value)
{
$this->salary = $this->salary + $value;
}
}
?>
Ověřme fungování naší třídy:
<?php
$employee = new Employee;
$employee->setName('john');
$employee->setSalary(1000);
$employee->increaseRevenue(100);
echo $employee->getSalary();
?>
Implementujme metodu increaseRevenue i
ve třídě Student. Tentokrát naše
metoda bude zvyšovat již stipendium:
<?php
class Student extends User
{
private $scholarship; // stipendium
public function getScholarship()
{
return $this->scholarship;
}
public function setScholarship($scholarship)
{
$this->scholarship = $scholarship;
}
// Metoda zvyšuje stipendium:
public function increaseRevenue($value)
{
$this->scholarship = $this->scholarship + $value;
}
}
?>
Přidejte do vaší třídy User stejnou
abstraktní metodu increaseRevenue.
Napište implementaci této metody ve třídách
Employee a Student.
Ve třídě Figure vytvořte abstraktní
metody pro získání obsahu a obvodu obrazce.