"Ciao, Amigo! Sono io—di nuovo. Voglio darti un altro punto di vista sulle interfacce. Vedi, la maggior parte delle volte una classe è un modello di un particolare oggetto. Al contrario, le interfacce sono più simili alle abilità di un oggetto o ruoli, piuttosto che l'oggetto stesso."

Ad esempio, cose come automobili, biciclette, motociclette e ruote sono meglio rappresentate come classi e oggetti. Ma le loro capacità, come «so muovermi», «so trasportare persone» e «so parcheggiare», sono meglio rappresentate come interfacce. Dai un'occhiata a questo esempio:

codice java Descrizione
interface Moveable
{
void move(String newAddress);
}
Corrisponde alla capacità di muoversi.
interface Driveable
{
void drive(Driver driver);
}
Corrisponde alla capacità di muoversi.
interface Transport
{
void addStuff(Object stuff);
Object removeStuff();
}
Corrisponde alla capacità di trasportare merci.
class Wheel implements Moveable
{
...
}
Una classe «ruota». Ha la capacità di muoversi.
class Car implements Moveable, Drivable, Transport
{
...
}
Una classe «macchina». Ha la capacità di muoversi, essere guidato da una persona e trasportare merci.
class Skateboard implements Moveable, Driveable
{
...
}
Una lezione di «skateboard». Ha la capacità di muoversi ed essere controllato da una persona.

Le interfacce semplificano notevolmente la vita del programmatore. I programmi molto spesso hanno migliaia di oggetti, centinaia di classi e solo un paio di dozzine di interfacce (ruoli). Ci sono pochi ruoli, ma possono essere combinati in molti modi (classi).

Il punto è che non devi scrivere codice che definisce l'interazione con ogni altra classe. Tutto quello che devi fare è interagire con i ruoli (interfacce).

Immagina di essere un costruttore robotico. Hai dozzine di robot subordinati e ognuno di loro può avere più abilità. Supponiamo che tu debba finire urgentemente di costruire un muro. Basta prendere tutti i robot che hanno la capacità di "costruire" e dire loro di costruire il muro. Non ti interessa davvero quali robot lo fanno. Lascia che sia un annaffiatoio robotico. Se sa costruire, lascia che costruisca.

Ecco come apparirebbe nel codice:

codice java Descrizione
static interface WallBuilder
{
void buildWall();
}
Capacità di «costruire un muro». Comprende il comando «costruisci un muro» (ha il metodo appropriato).
static class WorkerRobot implements WallBuilder
{
void buildWall()
 {
…
 }
}
static class GuardRobot implements WallBuilder
{
void buildWall()
 {
…
 }
}
static class WateringCan
{
…
}
Robot che hanno questa capacità/abilità.

Un annaffiatoio non può costruire un muro (non implementa l'interfaccia 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();
   }
  }
 }
}
Come diamo il comando di costruire un muro?

"È incredibilmente interessante. Non avrei mai immaginato che le interfacce potessero essere un argomento così interessante."

"E poi alcuni! Insieme al polimorfismo, è assolutamente strabiliante."