Viacero rozhraní v OOP v PHP
V PHP neexistuje viacnásobné dedenie - každá
trieda môže mať len jedného rodiča.
S rozhraniami je to však inak:
každá trieda môže implementovať ľubovoľný počet
rozhraní. Na to je potrebné mená rozhraní
uviesť oddelené čiarkou za kľúčovým slovom
implements.
To je ďalší rozdiel medzi rozhraniami a abstraktnými triedami - je možné implementovať viacero rozhraní, ale nie je možné zdediť viacero abstraktných tried.
Vyskúšajme si to v praxi. Predpokladajme, že okrem
rozhrania iFigure máme tiež
rozhranie iTetragon.
Metódy tohto rozhrania budú implementovať
triedy Quadrate a Rectangle,
pretože majú 4 strany, ale nie trieda
Disk.
Nech rozhranie iTetragon opisuje
gettery pre všetky štyri strany
štvoruholníka:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Predpokladajme tiež, že máme rozhranie iFigure,
ktoré sme vytvorili skôr:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Upravme triedu Quadrate tak,
aby implementovala dve rozhrania. Na to vypíšme
obe rozhrania oddelené čiarkou za kľúčovým
slovom implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// tu bude implementácia
}
?>
Dokončime teraz našu triedu Quadrate,
aby implementovala rozhranie iTetragon.
Je jasné, že náš štvorec je špeciálnym prípadom
štvoruholníka, pretože všetky strany štvorca
sú rovnaké. Preto všetky nové metódy
budú vracať to isté - šírku štvorca:
<?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;
}
}
?>
Je zrejmé, že v obdĺžniku už nie sú všetky
strany rovnaké, ale iba protiľahlé.
V tomto prípade sa nové metódy budú mierne
líšiť. A napríklad v lichobežníku
budú všetky 4 strany úplne odlišné.
Avšak nezáleží na tom, aký útvar budeme uvažovať - dôležité je, že všetky tieto útvary budú mať popísané metódy (aj keď niektoré útvary sú špeciálne prípady) a budú fungovať rovnako.
Upravte triedu Rectangle tak,
aby implementovala dve rozhrania: iFigure
a iTetragon.
Vytvorte rozhranie iCircle s metódami
getRadius a getDiameter.
Upravte triedu Disk tak,
aby implementovala dve rozhrania: iFigure
a iCircle.