Mitme liidese rakendamine OOP-s PHP-s
PHP-s puudub mitmikpärimus - igal
klassil võib olla ainult üks ülemklass.
Liidestega on aga teine lugu:
iga klass võib rakendada suvalise arvu
liideseid. Selleks tuleb liideste nimed
loetleda koma abil pärast võtmesõna
implements.
See on veel üks erinevus liideste ja abstraktsete klasside vahel - saab rakendada mitu liidest, kuid mitut abstraktset klassi pärida ei saa.
Proovime seda praktikas. Oletame, et peale
liidese iFigure on meil ka
liides iTetragon.
Selle liidese meetodid rakendavad
klassid Quadrate ja Rectangle,
kuna neil on 4 külge, kuid mitte klass
Disk.
Oletame, et liides iTetragon kirjeldab
getter-id kõikidele neljale nelinurga
küljele:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Oletame ka, et meil on liides iFigure,
mille me juba varem tegime:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Teeme nii, et klass Quadrate
rakendaks kahte liidest. Selleks loetleme
mõlemad liidesed koma abil pärast võtmesõna
implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// siin on rakendus
}
?>
Viime nüüd oma klassi Quadrate lõpuni,
et see rakendaks liidest iTetragon.
On selge, et meie ruut on degenereerunud
nelinurga juhtum, sest ruudul on
kõik küljed võrdsed. Seega kõik uued meetodid
tagavad sama asja - ruudu laiuse:
<?php
class Quadrate implements iFigure, iTetragon
{
private $a;
public function __construct($a)
{
$this->a = $a;
}
public function getA()
{
return $this->a;
}
public function getB()
{
return $this->a;
}
public function getC()
{
return $this->a;
}
public function getD()
{
return $this->a;
}
public function getSquare()
{
return $this->a * $this->a;
}
public function getPerimeter()
{
return 4 * $this->a;
}
}
?>
On ilmne, et ristkülikus pole jagi
kõik küljed samased, vaid vastasküljed.
Sellisel juhul uued meetodid muutuvad veidi
erinevaks. Noh, ja mõnes trapetsis
on üldse kõik 4 külge erinevad.
Siiski, pole vahet, millist kujundit me vaatleme - oluline on, et kõik need kujundid omavad kirjeldatud meetodeid (olgu mõned kujundid ka degenereerunud) ja töötavad ühtemoodi.
Tehke nii, et klass Rectangle
samuti rakendaks kahte liidest: nii iFigure
kui ka iTetragon.
Tehke liides iCircle meetoditega
getRadius ja getDiameter.
Tehke nii, et klass Disk samuti
rakendaks kahte liidest: nii iFigure
kui ka iCircle.