Více rozhraní v OOP v PHP
V PHP neexistuje vícenásobné dědění - každá
třída může mít pouze jednoho rodiče.
S rozhraními je to však jinak:
každá třída může implementovat libovolný počet
rozhraní. K tomu je třeba jména rozhraní
uvedout čárkou oddělená za klíčovým
slovem implements.
To je další rozdíl mezi rozhraními a abstraktními třídami - můžete implementovat hodně rozhraní, ale nelze zdědit více abstraktních tříd.
Pojďme to vyzkoušet v praxi. Předpokládejme, že kromě
rozhraní iFigure máme také
rozhraní iTetragon.
Metody tohoto rozhraní budou implementovat
třídy Quadrate a Rectangle,
protože mají 4 strany, ale ne třída
Disk.
Nechť rozhraní iTetragon popisuje
gettery pro všechny čtyři strany
čtyřúhelníku:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Předpokládejme také, že máme rozhraní iFigure,
které jsme již dříve vytvořili:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Udělejme tak, aby třída Quadrate
implementovala dvě rozhraní. K tomu vypišme
obě rozhraní čárkou oddělená za klíčovým
slovem implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// zde bude implementace
}
?>
Nyní upravme naši třídu Quadrate tak,
aby implementovala rozhraní iTetragon.
Je zřejmé, že náš čtverec je degenerovaným
případem čtyřúhelníku, protože čtverec má
všechny strany stejné. Proto všechny nové metody
budou vracet to samé - šířku čtverce:
<?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 zřejmé, že v obdélníku již nejsou
všechny strany stejné, ale pouze protilehlé.
V tomto případě se nové metody budou mírně
lišit. A v nějakém lichoběžníku
budou obecně všechny 4 strany různé.
Nezáleží však na tom, jaký útvar budeme uvažovat - důležité je, že všechny tyto útvary budou mít popsané metody (i když některé útvary jsou degenerované) a pracovat jednotně.
Zařiďte, aby třída Rectangle
také implementovala dvě rozhraní: iFigure
a iTetragon.
Vytvořte rozhraní iCircle s metodami
getRadius a getDiameter.
Zařiďte, aby třída Disk také
implementovala dvě rozhraní: iFigure
a iCircle.