Dedičnost razreda in implementacija vmesnika v OOP v PHP
Razred lahko podeduje od drugega razreda in hkrati implementira nek vmesnik. Oglejmo si praktični primer.
Recimo, da želimo narediti razred Programmer,
ki bo imel ime, plačo in seznam jezikov,
ki jih programer pozna.
Za zdaj je naš opis razreda precej nejasen:
da, v razredu bo ime, plača, jeziki -
toda katere metode bodo v našem razredu?
Opišimo naš razred natančneje z uporabo
vmesnika iProgrammer:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
Recimo, da smo preučili že implementirane
razrede in ugotovili, da imamo že podoben
razred Employee. Ne implementira vseh
metod razreda Programmer, ampak le del.
Tu je koda že obstoječega razreda:
<?php
class Employee
{
private $name;
private $salary;
public function __construct($name, $salary)
{
$this->name = $name;
$this->salary = $salary;
}
public function getName()
{
return $this->name;
}
public function getSalary()
{
return $this->salary;
}
}
?>
Logično je v našem primeru narediti tako, da
naš novi razred Programmer podeduje
del potrebnih metod od razreda
Employee (ostale bomo implementirali
kasneje v novem razredu):
<?php
class Programmer extends Employee
{
}
?>
Ob tem vemo, da mora razred Programmer
implementirati vmesnik
iProgrammer:
<?php
class Programmer implements iProgrammer
{
}
?>
Zdaj združimo dedovanje od razreda
Employee in implementacijo vmesnika
iProgrammer:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
Izkazalo se bo, da bo naš razred Programmer
podedoval od razreda Employee metode
__construct, getName in getSalary,
metode addLang in getLangs
pa bomo morali implementirati sami:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// implementacija
}
public function getLangs()
{
// implementacija
}
}
?>
Vmesniku iProgrammer je vseeno,
ali so metode native v razredu ali podedovane
- glavno je, da so vse opisane metode
implementirane.
Kopirajte kodo mojega razreda Employee
in kodo vmesnika iProgrammer. Ne kopirajte
moje predloge razreda Programmer -
ne gledaje v mojo kodo implementirajte ta
razred samostojno.