Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Da última vez, falamos sobre visibilidade e sobre como conseguimos ocultar informações utilizando os modificadores de visibilidade private e protected e assim, encapsular a lógica por trás de uma operação, falamos também que utilizamos a visibilidade public para os métodos que desejamos permitir que sejam acessados em nossos objetos e que esses métodos públicos chamam-se, na verdade, métodos de interface.
Quando eu disse que o encapsulamento era um dos aspectos mais importante era porque a interface de um objeto é definitivamente o aspecto mais importante em orientação a objetos.
Mas, se interface é o aspecto mais importante, precisamos definir interface, então, o que é interface ?
(computer science) a program that controls a display for the user (usually on a computer monitor) and that allows the user to interact with the system
Tradução livre:
(ciências da computação) um programa que controla uma exibição para o usuário (normalmente em um monitor) e que permite que o usuário interaja com o sistema
Perceba duas palavras chaves na tradução:
1. exibição /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/seta.gif&key=e2d72b30771339c36df1f88688ecc571784dab60a19e2c7c2ff398c277802ac0" alt="Imagem Postada" class="bbc_emoticon"> o que podemos ver
2. interaja /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/seta.gif&key=e2d72b30771339c36df1f88688ecc571784dab60a19e2c7c2ff398c277802ac0" alt="Imagem Postada" class="bbc_emoticon"> o que podemos trabalhar com
Então, interface é aquilo que podemos ver e trabalhar com, em orientação a objetos é exatamente a mesma coisa, métodos de interface são os métodos que podemos ver e trabalhar com, ou seja, por definição todo método público é um método de interface.
O fato, senhores, é que nossos objetos não saberiam como trabalhar uns com os outros se não fossem os métodos de interface. Até agora, falamos apenas como construir um objeto e como esconder sua lógica, porém, agora passaremos, enfim, a falar sobre programação orientada a objetos.
Já sabemos que herança de classe serve para compartilhar código entre seus herdeiros, agora passaremos a falar sobre tipos de objetos, vejam só:
"Atirei o pau no gato-to, mais o gato-to não moreu-reu-reu....."
Um pouco de português:
Atirei /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/seta.gif&key=e2d72b30771339c36df1f88688ecc571784dab60a19e2c7c2ff398c277802ac0" alt="Imagem Postada" class="bbc_emoticon"> verbo bi-transitivo, quem atira atira alguma coisa em alguém. /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/seta.gif&key=e2d72b30771339c36df1f88688ecc571784dab60a19e2c7c2ff398c277802ac0" alt="Imagem Postada" class="bbc_emoticon"> No caso, o sujeito oculto sou eu, eu atirei o pau no gao.
pau /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/seta.gif&key=e2d72b30771339c36df1f88688ecc571784dab60a19e2c7c2ff398c277802ac0" alt="Imagem Postada" class="bbc_emoticon"> substantivo, objeto direto pedido pelo verbo.
gato /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/seta.gif&key=e2d72b30771339c36df1f88688ecc571784dab60a19e2c7c2ff398c277802ac0" alt="Imagem Postada" class="bbc_emoticon"> substantivo, objeto indireto, pedido pelo verbo.
Ok, hehehehe, temos 3 participantes: o pau, o gato e eu
class Pau {
}
class Gato {
public function acerta( Pau $pau ) {
echo 'Miiiaaaaaauuuuuuuuuuuuu !!!!!';
}
}
class Eu {
public function atira( Pau $pau , Gato $gato ) {
$gato->acerta( $pau );
}
}
$gato = new Gato();
$pau = new Pau();
$eu = new Eu();
$eu->atira( $pau , $gato );
A saída será:
Miiiaaaaaauuuuuuuuuuuuu !!!!!
Atenção sociedade protetora dos animais, eu não faço esse tipo de coisa, foi meramente ilustrativo.
Bom, se os senhores prestarem atenção nas classes Eu e Gato, perceberão que existem um método atira() que recebe dois parâmetros, um Pau e o Gato. Percebam que essa implementação é muito dura e não conseguimos reproduzir a parte gramatical da coisa: "Quem atira, atira alguma coisa em alguém", porque Eu atira só e somente só um Pau no Gato, se precisarmos atirar Pedras ou qualquer outro tipo de objeto em Cães, Pássaros, ou qualquer outra coisa não será possível.
Para que consigamos atirar qualquer coisa em qualquer outra coisa, precisamos focar nos métodos de interface apenas, vejamos:
O gato possui um método de interface chamado acerta(), se transformarmos esse método em um contrato, onde qualquer classe que assine esse contrato precise necessariamente tê-lo, conseguiremos jogar alguma coisa em qualquer coisa que possua esse método:
interface Alvo {
public function acerta( Pau $pau );
}
Ai está, como podem ver, a construção de linguagem interface não implementa nada, ela é só um contrato que estipula um conjunto de operações que nossos objetos deverão ter, operações as quais nossos objetos poderão ver e trabalhar com.
Com a interface Alvo, podemos jogar Paus em gatos, cachorros, pessoas, paredes, enfim, qualquer coisa pode ser um alvo:
class Gato implements Alvo {
public function acerta( Pau $pau ) {
echo 'Miiiaaaaaauuuuuuuuuuuuu !!!!!';
}
}
class Cao implements Alvo {
public function acerta( Pau $pau ) {
echo 'Aaaaauuuuuuuuuuu !!!!!';
}
}
class Parede implements Alvo {
public function acerta( Pau $pau ) {
echo 'plof !!!!!';
}
}
Mas, ainda temos um problema com nossa questão gramatical, só conseguimos jogar Paus, e se quisermos jogar pedras ????
Você pode estar pensando: "Mas o Pau não tem métodos de interface"
O fato, é que não precisamos necessariamente de um método de interface para definir o Tipo de um objeto:
interface Projetil {
}
E dessa forma:
class Pau implements Projetil {
}
class Pedra implements Projetil {
}
class Sapato implements Projetil {
}
E agora nosso Alvo ficaria assim:
interface Alvo {
public function acerta( Projetil $projetil );
}
E nossas implementações:
class Gato implements Alvo {
public function acerta( Projetil $projetil ) {
echo 'Miiiaaaaaauuuuuuuuuuuuu !!!!!';
}
}
class Cao implements Alvo {
public function acerta( Projetil $projetil ) {
echo 'Aaaaauuuuuuuuuuu !!!!!';
}
}
class Parede implements Alvo {
public function acerta( Projetil $projetil ) {
echo 'plof !!!!!';
}
}
Agora, podemos jogar várias coisas em várias outras coisas:
$gato = new Gato();
$cao = new Cao();
$parede = new Parede();
$pau = new Pau();
$pedra = new Pedra();
$sapato = new Sapato();
$eu = new Eu();
$eu->atira( $pau , $gato );
$eu->atira( $sapato , $cao );
$eu->atira( $pedra , $parede );
A saída:
Miiiaaaaaauuuuuuuuuuuuu !!!!!Aaaaauuuuuuuuuuu !!!!! plof !!!!!
Bom, como o assunto é muito extenso e ainda falta muito, vamos parar por aqui hoje. No próximo artigo da série PHP Orientado a Objetos continuaremos falando sobre métodos de interface e polimorfismo.
/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">
Índice /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/seta.gif&key=e2d72b30771339c36df1f88688ecc571784dab60a19e2c7c2ff398c277802ac0" alt="Imagem Postada" class="bbc_emoticon">
Carregando comentários...