Metody abstrakcyjne w OOP w PHP
Klasy abstrakcyjne mogą również zawierać metody abstrakcyjne. Takie metody nie powinny mieć implementacji, a są potrzebne do wskazania, że takie metody powinny być u potomków. A właściwa implementacja takich metod - to już zadanie potomków.
Aby zadeklarować metodę jako abstrakcyjną,
przy jej deklaracji należy napisać słowo
kluczowe abstract.
Spróbujmy w praktyce. Załóżmy, że zakłada się,
iż wszyscy potomkowie klasy User powinni
mieć metodę increaseRevenue.
Ta metoda powinna brać bieżący dochód użytkownika i zwiększać go o pewną wartość, przekazaną parametrem.
Sama klasa User nie wie, jaki dokładnie
dochód będzie miał potomek - przecież u pracownika
to wynagrodzenie, a u studenta - stypendium. Dlatego
każdy potomek będzie implementował tę metodę
na swój sposób.
Sedno sprawy jest takie, że metoda abstrakcyjna klasy
User zmusza programistę do zaimplementowania
tej metody u potomków, inaczej PHP zwróci błąd.
W ten sposób ty, lub inny programista,
pracujący z twoim kodem, w żaden sposób nie będzie mógł
zapomnieć o zaimplementowaniu potrzebnej metody
u potomka.
Zatem, spróbujmy w praktyce. Dodajmy
metodę abstrakcyjną increaseRevenue
do klasy User:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
// Metoda abstrakcyjna bez ciała:
abstract public function increaseRevenue($value);
}
?>
Niech nasza klasa Employee na razie pozostanie
bez zmian. W tym przypadku, nawet jeśli nie
tworzyć obiektu klasy Employee,
a po prostu uruchomić kod, w którym definiowane są
nasze klasy, - PHP zwróci błąd.
Teraz napiszmy implementację metody
increaseRevenue w klasie
Employee:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
// Napiszmy implementację metody:
public function increaseRevenue($value)
{
$this->salary = $this->salary + $value;
}
}
?>
Sprawdźmy działanie naszej klasy:
<?php
$employee = new Employee;
$employee->setName('john');
$employee->setSalary(1000);
$employee->increaseRevenue(100);
echo $employee->getSalary();
?>
Zaimplementujmy metodę increaseRevenue i
w klasie Student. Tylko teraz nasza
metoda będzie zwiększać już stypendium:
<?php
class Student extends User
{
private $scholarship; // stypendium
public function getScholarship()
{
return $this->scholarship;
}
public function setScholarship($scholarship)
{
$this->scholarship = $scholarship;
}
// Metoda zwiększa stypendium:
public function increaseRevenue($value)
{
$this->scholarship = $this->scholarship + $value;
}
}
?>
Dodaj do swojej klasy User taką samą
metodę abstrakcyjną increaseRevenue.
Napisz implementację tej metody w klasach
Employee i Student.
W klasie Figure zrób abstrakcyjne
metody do uzyskiwania pola i obwodu figury.