Interfaces, qual a utilidade disso?

Há muito tempo aprendendo PHP 5, me deparei com Interfaces, mas não dei muita atenção. Agora, aprendendo Java, voltei a vê-las.

Será que tem alguma pessoa que sabe realmente qual a utilidade disto?

Acho que não.

Primeiro, por que criar os protótipos numa Interface, pra depois definir tudo denovo numa classe? Tipo:

interface um
{
public void fazAlgumaCoisa();
}

class dois implements um
{
public void fazAlgumaCoisa()
{

}
}

Teoricamente, eu só perdi tempo, pois além de escrever códito à “toa”, tive que definir o método tudo denovo na classe implementada. Sinceramente, acho isso ridículo…

Será que o uso de Interfaces é mais rápido, no termo de processamento, mas e no termo de economia de código?

acho que isso ajuda

isso também

e + um pouco de leitura

se precisar de mais

Uma “interface” abstrai a implementação de comportamentos.
A classe que implementa a “interface” ganha aquele comportamento.
É quase sempre melhor programar por interfaces que por classes, isto é, numa classe é melhor (a maioria das vezes) implementar um interface que extender uma classe.

Há vários motivos para fazer isso:

  1. Em Java, uma classe não pode extender mais que uma super-classe (Java não suporta herança múltipla). Por isso, se quiser adicionar comportamentos a sua classe tem dois caminhos que pode seguir: a - adicionar métodos a super classe, b - adicionar um “implements” para sua classe. O método (a) não é dos melhores, pois todas as sub classes vão ganhar aquele comportamento.

  2. Uma classe que implementa uma ou mais interfaces, passa a ser do tipo de cada uma das interfaces, isto é, pode ser “enxergada” por outros objetos como do tipo da interface que implementa.

Não sei se fui claro, se isso ajudou, más qualquer dúvida pode perguntar de novo a vontade.

Não se prenda muito a herança cara.

com interfaces o chamado acoplamento é muito menor facilitando muito a manutenção do código. Tente por exemplo modificar uma classe mãe que tenha 10 filhas. Vc já terá problemas :D.

A não ser que vc use composition por exemplo prefira sempre as interfaces onde herança não for imprescindível. :wink:

Acho que já deram boas respostas à sua pergunta (opinião?). Se elas não lhe foram suficientes, no entanto, vai uma forma de apresentar a questão que costumo passar para meus colaboradores:

Interface:

Representa o “contrato” entre componentes do sistema que vc. está desenvolvendo.

Herança:

Use-a para reaproveitamento de código.

Olá

Aproveitando a ótima resposta do Sevestre vou dar um conselho que me parece excelente para quem está começando:

Tente desenvolver um pequeno programinha com umas poucas classes sem usar interfaces. Depois experimente alterar um único parâmetro em um método de uma super classe.

Repita o teste tentando usar o máximo de interfaces alterando os conceitos “é um” por “tem um”. Radicalize, escreva o máximo possível como interfaces. Experimente mudar alguma coisa e veja o impacto. Veja como funciona a questão de métodos substituidos em interfaces. Aprenda o conceito usado pelo Swing das classes adapter e veja suas vantagens.

Para perceber a armadilha que é desenvolver baseado em herança, leia http://blog.caelum.com.br/2006/10/14/como-nao-aprender-orientacao-a-objetos-heranca/ e também o livro Effective Java

[]s
Luca