Apstraktne metode u OOP-u u PHP-u
Apstraktne klase takođe mogu sadržati apstraktne metode. Takve metode ne bi trebalo da imaju implementaciju, već služe da naznače da takve metode moraju postojati kod naslednika. A sama implementacija tih metoda - već je zadatak naslednika.
Da bi se metoda deklarisala kao apstraktna,
pri njenoj deklaraciji treba napisati ključnu
reč abstract.
Hajde da probamo u praksi. Pretpostavimo,
da svi naslednici klase User treba
da imaju metodu increaseRevenue.
Ova metoda treba da uzme trenutni prihod korisnika i da ga poveća za određenu vrednost, proslednu kao parametar.
Sama klasa User ne zna, kakav tačno
prihod će naslednik imati - jer kod zaposlenog
to je plata, a kod studenta - stipendija. Zato
će svaki naslednik implementirati ovu metodu
na svoj način.
Suština je u tome što apstraktna metoda klase
User primorava programera da implementira
ovu metodu u naslednicima, inače će PHP prijaviti grešku.
Tako vi, ili drugi programer,
koji radi sa vašim kodom, nikako nećete moći
da zaboravite da implementirate potrebnu metodu
u nasledniku.
Dakle, hajde da probamo u praksi. Dodajmo
apstraktnu metodu increaseRevenue
u klasu User:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
// Apstraktna metoda bez tela:
abstract public function increaseRevenue($value);
}
?>
Neka naša klasa Employee za sada ostane
bez izmena. U ovom slučaju, čak i ako ne
kreiramo objekat klase Employee,
već samo pokrenemo kod u kojem se definišu
naše klase, - PHP će prijaviti grešku.
Sada hajde da napišemo implementaciju metode
increaseRevenue u klasi
Employee:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
// Napišimo implementaciju metode:
public function increaseRevenue($value)
{
$this->salary = $this->salary + $value;
}
}
?>
Proverimo rad naše klase:
<?php
$employee = new Employee;
$employee->setName('john');
$employee->setSalary(1000);
$employee->increaseRevenue(100);
echo $employee->getSalary();
?>
Implementirajmo metodu increaseRevenue i
u klasi Student. Samo što će sada naša
metoda povećavati već stipendiju:
<?php
class Student extends User
{
private $scholarship; // stipendija
public function getScholarship()
{
return $this->scholarship;
}
public function setScholarship($scholarship)
{
$this->scholarship = $scholarship;
}
// Metoda povećava stipendiju:
public function increaseRevenue($value)
{
$this->scholarship = $this->scholarship + $value;
}
}
?>
Dodajte u vašu klasu User istu
apstraktnu metodu increaseRevenue.
Napišite implementaciju ove metode u klasama
Employee i Student.
U klasi Figure napravite apstraktne
metode za dobijanje površine i obima figure.