Abstraktsed meetodid OOP-s PHP-s
Abstraktsed klassid võivad sisaldada ka abstraktsed meetodid. Sellistel meetoditel ei pea olema implementatsiooni, vaid need on vajalikud selleks, et näidata, et sellised meetodid peaksid olema järglastel. Ja tegelik selliste meetodite implementeerimine - on juba järglaste ülesanne.
Selleks, et deklareerida meetod abstraktsena,
tuleb selle deklareerimisel kirjutada võtmesõna
abstract.
Proovime praktiliselt. Oletame, et eeldatakse,
et kõik klassi User järglased peaksid
omama meetodit increaseRevenue.
See meetod peaks võtma kasutaja praeguse tulu ja suurendama seda mingi väärtuse võrra, mis edastatakse parameetrina.
Klass User ise ei tea, millist täpselt
tulu järglane saab - sest töötajal
on see palk, aga üliõpilasel - stipendium. Seetõttu
iga järglane implementeerib selle meetodi
omamoodi.
Asja iva on selles, et abstraktne meetod klassis
User sunnib programmeerijat implementeerima
selle meetodi järglastes, vastasel juhul annab PHP vea.
Nii teie, või teine programmeerija,
kes teie koodiga töötab, ei suuda kuidagi
unustada vajaliku meetodi implementeerimist
järglases.
Nii, proovime praktiliselt. Lisame
abstraktse meetodi increaseRevenue
klassi User:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
// Abstraktne meetod ilma kehata:
abstract public function increaseRevenue($value);
}
?>
Olgu meie klass Employee jääb esialgu
muutmata. Sel juhul, isegi kui ei
loo klassi Employee objekti,
vaid lihtsalt käivitada kood, kus defineeritakse
meie klassid, - annab PHP vea.
Kirjutame nüüd meetodi increaseRevenue
implementatsiooni klassis Employee:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
// Kirjutame meetodi implementatsiooni:
public function increaseRevenue($value)
{
$this->salary = $this->salary + $value;
}
}
?>
Kontrollime meie klassi tööd:
<?php
$employee = new Employee;
$employee->setName('john');
$employee->setSalary(1000);
$employee->increaseRevenue(100);
echo $employee->getSalary();
?>
Implementeerime meetodi increaseRevenue ka
klassis Student. Ainult nüüd meie
meetod suurendab juba stipendiumi:
<?php
class Student extends User
{
private $scholarship; // stipendium
public function getScholarship()
{
return $this->scholarship;
}
public function setScholarship($scholarship)
{
$this->scholarship = $scholarship;
}
// Meetod suurendab stipendiumi:
public function increaseRevenue($value)
{
$this->scholarship = $this->scholarship + $value;
}
}
?>
Lisage oma klassi User samasugune
abstraktne meetod increaseRevenue.
Kirjutage selle meetodi implementatsioon klassidesse
Employee ja Student.
Klassis Figure tehke abstraktsed
meetodid kujundi pindala ja perimeetri saamiseks.