Abstraktne metode v OOP v PHP
Abstraktni razredi lahko vsebujejo tudi abstraktne metode. Te metode ne smejo imeti implementacije, namenjene so temu, da označijo, da morajo takšne metode imeti njihovi potomci. Dejansko implementacijo teh metod je naloga potomcev.
Za razglasitev metode za abstraktno,
je treba pri njeni deklaraciji napisati ključno
besedo abstract.
Poskusimo v praksi. Predpostavimo,
da morajo vsi potomci razreda User
imeti metodo increaseRevenue.
Ta metoda mora vzeti trenutni dohodek uporabnika in ga povečati za določeno vrednost, posredovano kot parameter.
Sam razred User ne ve, kakšen točno
dohodek bo imel njegov potomec - saj je za zaposlenega
to plača, za študenta pa štipendija. Zato
bo vsak potomec to metodo implementiral
na svoj način.
Bistvo je v tem, da abstraktna metoda razreda
User prisili programerja, da implementira
to metodo v potomcih, sicer bo PHP izdal napako.
Tako vi ali drug programer,
ki dela z vašo kodo, ne boste mogli
pozabiti implementirati potrebne metode
v potomcu.
Torej, poskusimo v praksi. Dodajmo
abstraktno metodo increaseRevenue
v razred User:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
// Abstraktna metoda brez telesa:
abstract public function increaseRevenue($value);
}
?>
Naj naš razred Employee za zdaj ostane
nespremenjen. V tem primeru, tudi če ne
ustvarimo objekta razreda Employee,
ampak samo zaženemo kodo, v kateri so definirani
naši razredi, - bo PHP izdal napako.
Zdaj pa napišimo implementacijo metode
increaseRevenue v razredu
Employee:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
// Napišimo implementacijo metode:
public function increaseRevenue($value)
{
$this->salary = $this->salary + $value;
}
}
?>
Preverimo del našega razreda:
<?php
$employee = new Employee;
$employee->setName('john');
$employee->setSalary(1000);
$employee->increaseRevenue(100);
echo $employee->getSalary();
?>
Implementirajmo metodo increaseRevenue tudi
v razredu Student. Le da bo sedaj naša
metoda povečala štipendijo:
<?php
class Student extends User
{
private $scholarship; // štipendija
public function getScholarship()
{
return $this->scholarship;
}
public function setScholarship($scholarship)
{
$this->scholarship = $scholarship;
}
// Metoda poveča štipendijo:
public function increaseRevenue($value)
{
$this->scholarship = $this->scholarship + $value;
}
}
?>
Dodajte v vaš razred User enako
abstraktno metodo increaseRevenue.
Napišite implementacijo te metode v razredih
Employee in Student.
V razredu Figure naredite abstraktne
metode za pridobitev površine in obsega figure.