Osztály öröklődés és interfész implementálás az OOP-ban PHP-ben
Egy osztály örökölhet egy másik osztálytól és közben implementálhat egy interfészt. Nézzük ezt egy gyakorlati példán keresztül.
Tegyük fel, hogy szeretnénk készíteni egy Programmer osztályt,
aminek neve, fizetése és egy listája nyelvekről lesz,
amelyeket a programozó ismer.
Egyelőre az osztály leírása nagyon homályos:
igen, az osztálynak lesz neve, fizetése, nyelvei -
de milyen metódusok lesznek az osztályunkban?
Írjuk le pontosabban az osztályunkat az
iProgrammer interfész segítségével:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
Tegyük fel, hogy átnéztük a már implementált
osztályainkat és kiderül, hogy már van egy hasonló
Employee osztályunk. Az nem valósítja meg az összes
Programmer osztály metódusát, de egy részét.
Itt a kód a már létező osztályunkból:
<?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;
}
}
?>
Logikus ebben az esetben azt tenni, hogy
az új Programmer osztályunk örökölje
a szükséges metódusok egy részét a
Employee osztálytól (a maradékot pedig aztán
maga az új osztály implementálja):
<?php
class Programmer extends Employee
{
}
?>
Közben tudjuk, hogy a Pogrammer osztálynak
implementálnia kell az iProgrammer
interfészt:
<?php
class Programmer implements iProgrammer
{
}
?>
Kombináljuk az öröklődést a
Employee osztálytól és az iProgrammer
interfész implementálását:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
Így a Pogrammer osztályunk
örökölni fogja a Employee osztálytól a
__construct, getName és getSalary metódusokat,
a addLang és getLangs metódusokat
pedig nekünk kell implementálnunk:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// implementáció
}
public function getLangs()
{
// implementáció
}
}
?>
Az iProgrammer interfészt nem érdekli,
hogy az osztály metódusai sajátak vagy örököltek
- a lényeg, hogy minden leírt metódus legyen
implementálva.
Másolja le a Employee osztályom kódját
és az iProgrammer interfész kódját. Ne másolja
a Programmer osztályom vázlatát -
anélkül, hogy belenézne a kódomba, valósítsa meg ezt
az osztályt önállóan.