Abstraktūs metodai OOP PHP
Abstraktūs klasės taip pat gali turėti abstrakčius metodus. Tokie metodai neturėtų turėti implementacijos, o reikalingi tam, kad nurodyti, kad tokie metodai turi būti palikuoniuose. O pati tokių metodų implementacija - jau palikuonių užduotis.
Norint paskelbti metodą abstrakčiu,
prie jo deklaracijos reikia parašyti raktinį
žodį abstract.
Pabandykime praktiškai. Tarkime, numatoma,
kad visi klasės User palikuoniai turi
turėti metodą increaseRevenue.
Šis metodas turi paimti esamas vartotojo pajamas ir padidinti jas tam tikru dydžiu, perduotu parametru.
Pati klasė User nežino, kokios tiksliai
pajamas gaus palikuonis - juk darbuotojo
atveju tai atlyginimas, o studento - stipendija. Todėl
kiekvienas palikuonis implementuos šį metodą
savaip.
Esmė ta, kad abstraktus klasės
User metodas priverčia programuotoją implementuoti
šį metodą palikuoniuose, kitaip PHP išmes klaidą.
Taip jūs, ar kitas programuotojas,
dirbantis su jūsų kodu, jokiu būdu negalėsite
pamiršti implementuoti reikalingą metodą
palikuonyje.
Taigi, pabandykime praktiškai. Pridėkime
abstraktų metodą increaseRevenue
į klasę User:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
// Abstraktus metodas be kūno:
abstract public function increaseRevenue($value);
}
?>
Tegul mūsų klasė Employee kol kas lieka
be pakeitimų. Tokiu atveju, net jei ne
kurti klasės Employee objekto,
o tik paleisti kodą, kuriame apibrėžiamos
mūsų klasės, - PHP išmes klaidą.
Dabar parašykime metodo
increaseRevenue implementaciją klasėje
Employee:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
// Parašykime metodo implementaciją:
public function increaseRevenue($value)
{
$this->salary = $this->salary + $value;
}
}
?>
Patikrinkime mūsų klasės veikimą:
<?php
$employee = new Employee;
$employee->setName('john');
$employee->setSalary(1000);
$employee->increaseRevenue(100);
echo $employee->getSalary();
?>
Implementuokime metodą increaseRevenue ir
klasėje Student. Tik dabar mūsų
metodas padidins jau stipendiją:
<?php
class Student extends User
{
private $scholarship; // stipendija
public function getScholarship()
{
return $this->scholarship;
}
public function setScholarship($scholarship)
{
$this->scholarship = $scholarship;
}
// Metodas padidina stipendiją:
public function increaseRevenue($value)
{
$this->scholarship = $this->scholarship + $value;
}
}
?>
Pridėkite į jūsų klasę User tokį patį
abstraktų metodą increaseRevenue.
Parašykite šio metodo implementaciją klasėse
Employee ir Student.
Klasėje Figure padarykite abstrakčius
metodus figūros ploto ir perimetro gavimui.