Múltiples interfaces en POO en PHP
En PHP no hay herencia múltiple - cada
clase solo puede tener un padre.
Sin embargo, con las interfaces es diferente:
cada clase puede implementar cualquier cantidad de
interfaces. Para ello, los nombres de las interfaces
deben enumerarse separados por comas después de la palabra clave
implements.
Esta es otra diferencia entre las interfaces y las clases abstractas - se pueden implementar muchas interfaces, pero no se pueden heredar varias clases abstractas.
Probemos en la práctica. Supongamos que además
del interfaz iFigure también tenemos
el interfaz iTetragon.
Los métodos de esta interfaz serán implementados por
las clases Quadrate y Rectangle,
ya que tienen 4 lados, pero no por la clase
Disk.
Supongamos que la interfaz iTetragon describe
los getters para los cuatro lados
del cuadrilátero:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Supongamos también que tenemos la interfaz iFigure,
que ya hicimos anteriormente:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Hagamos que la clase Quadrate
implemente dos interfaces. Para ello enumeremos
ambas interfaces separadas por coma después de la palabra clave
implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// aquí irá la implementación
}
?>
Modifiquemos ahora nuestra clase Quadrate
para que implemente la interfaz iTetragon.
Está claro que nuestro cuadrado es un caso degenerado
de cuadrilátero, ya que en un cuadrado
todos los lados son iguales. Por lo tanto, todos los métodos nuevos
devolverán lo mismo - el ancho del cuadrado:
<?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;
}
}
?>
Obviamente, en un rectángulo no todos
los lados son iguales, solo los opuestos.
En este caso, los nuevos métodos serán ligeramente
diferentes. Y, en un trapecio cualquiera,
generalmente los 4 lados serán todos diferentes.
Sin embargo, no importa qué figura consideremos - lo importante es que todas estas figuras tendrán los métodos descritos (aunque algunas figuras sean degeneradas) y funcionarán de manera uniforme.
Haz que la clase Rectangle
también implemente dos interfaces: tanto iFigure,
como iTetragon.
Crea la interfaz iCircle con los métodos
getRadius y getDiameter.
Haz que la clase Disk también
implemente dos interfaces: tanto iFigure,
como iCircle.