Implémentation de plusieurs interfaces en POO en PHP
En PHP, il n'y a pas d'héritage multiple - chaque
classe ne peut avoir qu'un seul parent.
Cependant, avec les interfaces, c'est différent :
chaque classe peut implémenter n'importe quel nombre
d'interfaces. Pour cela, les noms des interfaces
doivent être listés après le mot-clé
implements, séparés par des virgules.
Ceci montre une autre différence entre les interfaces et les classes abstraites - on peut implémenter plusieurs interfaces, mais on ne peut pas hériter de plusieurs classes abstraites.
Essayons pratiquement. Supposons qu'en plus
de l'interface iFigure, nous ayons également
l'interface iTetragon.
Les méthodes de cette interface seront implémentées par
les classes Quadrate et Rectangle,
car elles ont 4 côtés, mais pas par la classe
Disk.
Supposons que l'interface iTetragon décrive
des accesseurs (getters) pour les quatre côtés
d'un quadrilatère :
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Supposons également que nous ayons l'interface iFigure,
que nous avons déjà créée précédemment :
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Faisons en sorte que la classe Quadrate
implémente deux interfaces. Pour cela, listons
les deux interfaces après le mot-clé
implements, séparées par une virgule :
<?php
class Quadrate implements iFigure, iTetragon
{
// le code d'implémentation sera ici
}
?>
Complétons maintenant notre classe Quadrate
pour qu'elle implémente l'interface iTetragon.
Il est clair que notre carré est un cas particulier
de quadrilatère, car dans un carré
tous les côtés sont égaux. Par conséquent, toutes les nouvelles méthodes
retourneront la même chose - la largeur du carré :
<?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;
}
}
?>
Il est évident que dans un rectangle, tous
les côtés ne sont pas identiques, seuls les côtés opposés le sont.
Dans ce cas, les nouvelles méthodes seront légèrement
différentes. Et dans un trapèze, par exemple,
les 4 côtés seront tous différents.
Cependant, peu importe la forme que nous considérons - l'important est que toutes ces formes auront les méthodes décrites (même si certaines formes sont des cas particuliers) et fonctionneront de manière uniforme.
Faites en sorte que la classe Rectangle
implémente également deux interfaces : à la fois iFigure,
et iTetragon.
Créez une interface iCircle avec les méthodes
getRadius et getDiameter.
Faites en sorte que la classe Disk
implémente également deux interfaces : à la fois iFigure,
et iCircle.