Meerdere interfaces in OOP in PHP
In PHP is er geen meervoudige overerving - elke
klasse kan slechts één ouder hebben.
Met interfaces is het echter anders:
elke klasse kan elk aantal
interfaces implementeren. Om dit te doen moeten de interfacenamen
opgesomd worden, gescheiden door komma's, na het sleutelwoord
implements.
Dit laat een ander verschil zien tussen interfaces en abstracte klassen - je kunt veel interfaces implementeren, maar je kunt niet van meerdere abstracte klassen overerven.
Laten we het in de praktijk proberen. Stel dat we naast
de interface iFigure ook de
interface iTetragon hebben.
De methodes van deze interface zullen worden geïmplementeerd door
de klassen Quadrate en Rectangle,
omdat zij 4 zijden hebben, maar niet door de klasse
Disk.
Stel dat de interface iTetragon
getters beschrijft voor alle vier de zijden
van de vierhoek:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Stel dat we ook de interface iFigure hebben,
die we eerder al hebben gemaakt:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Laten we ervoor zorgen dat de klasse Quadrate
twee interfaces implementeert. Om dit te doen enumereren we
beide interfaces, gescheiden door een komma, na het sleutelwoord
implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// hier komt de implementatie
}
?>
Laten we nu onze klasse Quadrate aanpassen,
zodat deze de interface iTetragon implementeert.
Het is duidelijk dat ons vierkant een gedegenereerd
geval is van een vierhoek, want bij een vierkant
zijn alle zijden gelijk. Daarom zullen alle nieuwe methodes
hetzelfde teruggeven - de breedte van het vierkant:
<?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;
}
}
?>
Het is duidelijk dat in een rechthoek niet alle
zijden hetzelfde zijn, maar alleen de tegenoverliggende.
In dit geval zullen de nieuwe methodes een beetje
gaan verschillen. En in een willekeurige trapezium
zullen over het algemeen alle 4 zijden verschillend zijn.
Het maakt echter niet uit welke vorm we beschouwen - belangrijk is dat al deze vormen de beschreven methodes zullen hebben (ook al zijn sommige vormen gedegenereerd) en op een uniforme manier werken.
Zorg ervoor dat de klasse Rectangle
ook twee interfaces implementeert: zowel iFigure,
als iTetragon.
Maak een interface iCircle met de methodes
getRadius en getDiameter.
Zorg ervoor dat de klasse Disk ook
twee interfaces implementeert: zowel iFigure,
als iCircle.