– Cześć, Amigo! To znowu ja. Chcę pokazać Ci interfejsy od innej strony. Widzisz, klasa stanowi najczęściej model pewnego obiektu. Z kolei interfejsy są bardziej jak umiejętności lub role tego obiektu niż sam obiekt.

Interfejs jest czymś więcej niż się to wydaje. Jest zachowaniem. - 1

Na przykład, rzeczy takie jak samochody, rowery, motocykle czy koła reprezentowane są jako klasy i obiekty. Ale ich umiejętności, takie jak «Potrafię się przemieszczać», «Potrafię przewozić ludzi» czy «Potrafię parkować» lepiej jest reprezentować jako interfejsy. Przeanalizuj ten przykład:

Kod Java Opis
interface Moveable
{
void move(String newAddress);
}
Odnosi się do zdolności poruszania się.
interface Driveable
{
void drive(Driver driver);
}
— Odnosi się do zdolności poruszania się.
interface Transport
{
void addStuff(Object stuff);
Object removeStuff();
}
— Odnosi się do zdolności przewożenia rzeczy.
class Wheel implements Moveable
{
...
}
— Klasa «wheel». Posiada umiejętność przemieszczania się.
class Car implements Moveable, Drivable, Transport
{
...
}
— Klasa «car». Posiada umiejętność przemieszczania się, przewożenia towaru, może też być przez kogoś prowadzona.
class Skateboard implements Moveable, Driveable
{
...
}
— Klasa «skateboard». Posiada umiejętność przemieszczania się i bycia kontrolowaną.

Interfejsy niezwykle upraszczają życie programisty. W programach bardzo często znajdują się tysiące obiektów, setki klas i tylko kilkadziesiąt interfejsów (funkcji). Funkcji nie ma wiele, ale mogą być łączone na wiele różnych sposobów (klas).

Chodzi o to, że nie musisz pisać kodu definiującego interakcje z każdą inną klasą. Musisz jedynie wchodzić w interakcje z funkcjami (interfejsami).

Wyobraź sobie, że budujesz roboty. Masz dziesiątki podległych Ci robotów i każdy z nich ma różnorodne umiejętności. Załóżmy, że musisz szybko ukończyć budowanie ściany. Po prostu wzywasz wszystkie roboty, które posiadają umiejętność "build" i każesz im budować ścianę. Nie obchodzi Cię już, które roboty to zrobią. Może to być nawet robotyczna konewka. Jeśli wiedzą, jak się buduje, to niech budują.

W kodzie wyglądałoby to tak:

Kod Java Opis
static interface WallBuilder
{
void buildWall();
}
— Umiejętność «budowania ściany». Rozumie komendę «build a wall» (posiada odpowiednią metodę).
static class WorkerRobot implements WallBuilder
{
void buildWall()
 {
…
 }
}
static class GuardRobot implements WallBuilder
{
void buildWall()
 {
…
 }
}
static class WateringCan
{
…
}
— Roboty, które mają taką możliwość/umiejętność.

— Konewka nie potrafi budować ściany (nie implementuje interfejsu WallBuilder).

public static void main(String[] args)
{
 //dodaje wszystkie roboty do listy
 ArrayList robots = new ArrayList();
 robots.add(new WorkerRobot());
 robots.add(new GuardRobot());
 robots.add(new WateringCan());

 //buduj ścianę, jeśli potrafisz
 for (Object robot: robots)
 {
  if (robot instanceof WallBuilder)
  {
   WallBuilder builder = (WallBuilder) robot;
   builder.buildWall();
   }
  }
 }
}
– Jak wydajemy komendę budowania ściany?

– W niezwykle interesujący sposób. Nigdy nie sądziłem, że interfejsy mogą być takie fascynujące.

– A jednak! W parze z polimorfizmem są naprawdę niesamowite.