Várias interfaces em POO em PHP
Em PHP, não há herança múltipla - cada
classe pode ter apenas um pai.
No entanto, com interfaces, a situação é diferente:
cada classe pode implementar qualquer número de
interfaces. Para isso, os nomes das interfaces
devem ser listados separados por vírgula após a palavra-chave
implements.
Esta é mais uma diferença entre interfaces e classes abstratas - é possível implementar muitas interfaces, mas não é possível herdar várias classes abstratas.
Vamos experimentar na prática. Suponha que, além da
interface iFigure, também tenhamos a
interface iTetragon.
Os métodos desta interface serão implementados pelas
classes Quadrate e Rectangle,
pois elas têm 4 lados, mas não pela classe
Disk.
Suponha que a interface iTetragon descreva
os getters para todos os quatro lados
do quadrilátero:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Suponha também que temos a interface iFigure,
que já fizemos anteriormente:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Vamos fazer com que a classe Quadrate
implemente duas interfaces. Para isso, listamos
ambas as interfaces separadas por vírgula após a palavra-chave
implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// aqui ficará a implementação
}
?>
Agora, vamos ajustar nossa classe Quadrate
para que ela implemente a interface iTetragon.
É claro que nosso quadrado é um caso degenerado
de quadrilátero, pois em um quadrado
todos os lados são iguais. Portanto, todos os novos métodos
retornarão a mesma coisa - a largura do quadrado:
<?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, em um retângulo, nem todos os
lados são iguais, apenas os opostos.
Nesse caso, os novos métodos serão um pouco
diferentes. E, em um trapézio,
todos os 4 lados serão completamente diferentes.
No entanto, não importa qual figura consideremos - o importante é que todas essas figuras terão os métodos descritos (mesmo que algumas figuras sejam degeneradas) e funcionarão de maneira uniforme.
Faça com que a classe Rectangle
também implemente duas interfaces: iFigure
e iTetragon.
Crie a interface iCircle com os métodos
getRadius e getDiameter.
Faça com que a classe Disk também
implemente duas interfaces: iFigure
e iCircle.