Luokan perintä ja rajapinnan toteutus OOP:ssa PHP:ssä
Luokka voi periä toisesta luokasta ja samalla toteuttaa jotain rajapintaa. Tarkastellaan käytännön esimerkillä.
Oletetaan, että haluamme tehdä luokan Programmer,
jolla on nimi, palkka ja lista kielistä,
joita ohjelmoija osaa.
Tällä hetkellä luokkamme kuvaus on melko epämääräinen:
kyllä, luokassa on nimi, palkka, kielet -
mutta mitkä metodit luokassamme tulevat olemaan?
Kuvataan luokkaamme tarkemmin
rajapinnan iProgrammer avulla:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
Oletetaan, että olemme kaivautuneet jo toteuttamiemme
luokkien joukkoon ja, kääntääkö, meillä on jo samankaltainen
luokka Employee. Se ei toteuta kaikkia
luokan Programmer metodeja, mutta osan.
Tässä on koodi jo olemassa olevasta luokastamme:
<?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;
}
}
?>
On loogista tehdä niin, että
uusi luokkamme Programmer perii
osan tarvitsemistaan metodeista luokasta
Employee (ja osan toteutamme
myöhemmin uudessa luokassa):
<?php
class Programmer extends Employee
{
}
?>
Samalla tiedämme, että luokan Pogrammer
tulee toteuttaa rajapinta
iProgrammer:
<?php
class Programmer implements iProgrammer
{
}
?>
Yhdistetään luokan Employee perintä
ja rajapinnan iProgrammer toteutus:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
Saamme siis sen, että luokkamme Pogrammer
perii luokalta Employee metodit
__construct, getName ja getSalary,
ja metodit addLang ja getLangs
meidän on toteutettava itse:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// toteutus
}
public function getLangs()
{
// toteutus
}
}
?>
Rajapinnalle iProgrammer ei ole väliä,
ovatko metodit luokan omia vai perittyjä
- tärkeintä on, että kaikki kuvatut metodit ovat
toteutettuna.
Kopioi luokkani Employee koodi
ja rajapinnan iProgrammer koodi. Älä kopio
luokan Programmer aihiota -
toteuta tämä luokka itse katsomatta koodiini.