"Olá, amigo! Sou eu - de novo. Quero dar a você outro ponto de vista sobre interfaces. Veja bem, na maioria das vezes uma classe é um modelo de um objeto específico. Por outro lado, as interfaces são mais como as habilidades de um objeto ou papéis, ao invés do objeto em si."

Por exemplo, coisas como carros, bicicletas, motocicletas e rodas são melhor representadas como classes e objetos. Mas suas habilidades, como «posso me mover», «posso carregar pessoas» e «posso estacionar», são melhor representadas como interfaces. Confira este exemplo:

código Java Descrição
interface Moveable
{
void move(String newAddress);
}
Corresponde à capacidade de movimento.
interface Driveable
{
void drive(Driver driver);
}
Corresponde à capacidade de movimento.
interface Transport
{
void addStuff(Object stuff);
Object removeStuff();
}
Corresponde à capacidade de transportar carga.
class Wheel implements Moveable
{
...
}
Uma aula de «roda». Tem a capacidade de se mover.
class Car implements Moveable, Drivable, Transport
{
...
}
Uma aula de «carro». Tem a capacidade de se mover, ser conduzido por uma pessoa e transportar carga.
class Skateboard implements Moveable, Driveable
{
...
}
Uma aula de «skate». Tem a capacidade de se mover e ser controlado por uma pessoa.

As interfaces simplificam muito a vida do programador. Os programas geralmente têm milhares de objetos, centenas de classes e apenas algumas dezenas de interfaces (funções). São poucos papéis, mas podem ser combinados de várias formas (classes).

O ponto principal é que você não precisa escrever código definindo a interação com todas as outras classes. Tudo o que você precisa fazer é interagir com funções (interfaces).

Imagine que você é um construtor robótico. Você tem dezenas de robôs subordinados e cada um deles pode ter várias habilidades. Suponha que você precise terminar de construir uma parede com urgência. Você apenas pega todos os robôs que têm a capacidade de "construir" e diz a eles para construir o muro. Você realmente não se importa com quais robôs fazem isso. Que seja um regador robótico. Se ela sabe construir, deixe-a construir.

Veja como ficaria no código:

código Java Descrição
static interface WallBuilder
{
void buildWall();
}
Capacidade de «construir uma parede». Compreende o comando «construir uma parede» (tem o método adequado).
static class WorkerRobot implements WallBuilder
{
void buildWall()
 {
…
 }
}
static class GuardRobot implements WallBuilder
{
void buildWall()
 {
…
 }
}
static class WateringCan
{
…
}
Robôs que possuem essa habilidade/habilidade.

Um regador não pode construir uma parede (ele não implementa a interface WallBuilder).

public static void main(String[] args)
{
 //add all robots to a list
 ArrayList robots = new ArrayList();
 robots.add(new WorkerRobot());
 robots.add(new GuardRobot());
 robots.add(new WateringCan());

 //build a wall if you can
 for (Object robot: robots)
 {
  if (robot instanceof WallBuilder)
  {
   WallBuilder builder = (WallBuilder) robot;
   builder.buildWall();
   }
  }
 }
}
Como damos a ordem para construir um muro?

"Isso é incrivelmente interessante. Nunca sonhei que as interfaces pudessem ser um tópico tão interessante."

"E mais alguns! Juntamente com o polimorfismo, é totalmente alucinante."