Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Continuando sobre métodos de interface e polimorfismo, vimos até agora que nossos objetos só conseguem trabalhar uns com os outros através de sua interface, que são os métodos que podem ser vistos, ou seja, só podemos pedir para que um objeto efetue uma operação ou nos forneça alguma informação utilizando-se sua interface
Vimos também que uma interface não serve para "amarrar" nosso código, pelo contrário, serve para remover as dependências de uma implementação.
Mas, o que é remover as dependências de uma implementação ?
Vimos que herança de classes permite compartilhar código, mas imaginem que tenhamos um Pau, um Gato e Eu.
Eu, como uma instância de Pessoa posso jogar alguma coisa em alguma outra coisa, mas vejam, eu como programador, posso assumir o cargo como engenheiro em uma empresa de desenvolvimento de software.
Não existiria qualquer sentido se eu tivesse duas implementações distintas de Eu já que Eu que joga o pau no gato é o mesmo Eu que pode desenvolver uma aplicação.
Polimorfismo é a capacidade de um mesmo objeto de se comportar de diversas formas diferentes ou de objetos totalmente diferentes se comportarem de forma igual.
Vejamos:
interface Projetil {
}
interface Alvo {
public function acerta( Projetil $projetil );
}
Anteriormente, a necessidade de se atirar alguma qualquer coisa em qualquer outra coisa fez com que criássemos as interfaces Projetil e Alvo, com isso passamos a poder jogar, além de pedras em gatos, sapatos em cachorros, mas:
interface Calcavel {
public function mostraNumero();
}
Além de poder jogar um sapato no cachorro, podemos também calçá-lo e, como disse, Eu sou uma Pessoa que posso jogar coisas em outras coisas e ser programador ao mesmo tempo:
interface Pessoa {
public function mostraNome();
public function calca( Calcavel $calcavel );
}
interface Programador {
public function escreveCodigo();
}
interface Atirador {
public function atira( Alvo $alvo );
}
Dessa forma:
class Eu implements Pessoa, Programador, Atirador {
private $calcado;
public function mostraNome(){
echo 'Sou o Neto' , PHP_EOL;
return 'Neto';
}
public function escreveCodigo(){
echo '<?php' , PHP_EOL , 'echo "Polimorfismo é legal.";' , PHP_EOL;
}
public function atira( Alvo $alvo ){
if ( $this->calcado ){
$alvo->acerta( $this->calcado );echo 'Estou descalço.' , PHP_EOL;
}
}
public function calca( Calcavel $calcavel ){
$this->calcado = $calcavel;
}
}
class Sapato implements Projetil, Calcavel {
private $numero;
public function __construct( $numero ){
$this->numero = $numero;
}
public function mostraNumero(){
echo 'Sapato número ' , $this->numero , PHP_EOL;
}
}
class Cachorro implements Alvo {
public function acerta( Projetil $projetil ){
echo 'Cain, cain, cain, cain...' , PHP_EOL;
}
}
Vejam que Eu é uma Pessoa mas também um Atirador e um Programador, se eu estiver indo ao trabalho e no caminho encontrar um cachorro:
$eu = new Eu();
$eu->calca( new Sapato( 42 ) );
$eu->atira( new Cachorro() );
Saída:
Cain, cain, cain, cain...
Mas, se eu for até uma empresa:
class Empresa {
public function conversa( Pessoa $pessoa ){
$nome = $pessoa->mostraNome();
echo 'Olá ' , $nome , ', seja bem vindo...' , PHP_EOL;
}
public function contrata( Programador $programador ){
$programador->escreveCodigo();
}
}
O mesmo Eu que anteriormente jogou o próprio sapato no cachorro, pode conversar na Empresa já que além de Atirador, sou também uma Pessoa:
$eu = new Eu();
$empresa = new Empresa();
$empresa->conversa( $eu );
Saída:
Sou o NetoOlá Neto, seja bem vindo...
E ainda, posso trabalhar como programador:
$eu = new Eu();
$empresa = new Empresa();
$empresa->contrata( $eu );
A saída:
<?phpecho "Polimorfismo é legal.";
Percebam que o objeto Empresa apenas conversa com Pessoa e apenas contrata Programador, como Eu além de Atirador é também uma Pessoa e um Programador, ele pode comportar-se de acordo com a situação, ou seja, o mesmo objeto Eu comporta-se de várias formas diferentes.
Bom, por hoje é só, no próximo artigo da série PHP Orientado a Objetos vamos continuar falando sobre polimorfismo e introduziremos as classes abstratas.
/applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/wink.gif&key=0566fd943552bcff9cb1b879403ca34b5ff8f67befaac7fe4648006e9f764689" alt="Imagem Postada" class="bbc_emoticon">
Carregando comentários...