— Привіт! У цій лекції хочу познайомити тебе з іще одною точкою зору на інтерфейси. Розумієш, клас – це найчастіше модель якогось конкретного об'єкта. Інтерфейс більше відповідає не об'єктам, а їхнім здібностям чи ролям.

Наприклад, такі речі як авто, велосипед, мотоцикл та колесо найкраще зобразити у вигляді класів та об'єктів. А такі їхні здібності як «можу їздити», «можу перевозити людей», «можу стояти» — краще зобразити у вигляді інтерфейсів. Дивись приклад:

Код на Java Опис
interface Moveable {
    void move(String newAddress);
}
— відповідає здатності пересуватися.
interface Driveable {
    void drive(Driver driver);
}
— відповідає здатності керуватися водієм.
interface Transport {
    void addStuff(Object stuff);
    Object removeStuff();
}
— відповідає здатності перевозити вантажі.
class Wheel implements Moveable {
    ...
}
— клас «колесо». Має здатність пересуватися.
class Car implements Moveable, Drivable, Transport {
   ...
}
— клас «авто». Має здатність пересуватися, керуватися людиною і перевозити вантажі.
class Skateboard implements Moveable, Driveable
{
...
}
— клас «скейтборд». Має здатність пересуватися і керуватися людиною.

Інтерфейси дуже спрощують життя програміста. Дуже часто у програмі тисячі об'єктів, сотні класів та лише пара десятків інтерфейсів – ролей. Ролей мало, а їхніх комбінацій – класів – дуже багато.

Увесь сенс в тому, що тобі не потрібно писати код для взаємодії з усіма класами. Тобі достатньо взаємодіяти зі своїми ролями (інтерфейсами).

Уяви, що ти – робот-будівельник, і в тебе є десятки роботів, кожен з яких може мати кілька професій. Тобі потрібно терміново добудувати стіну. Ти береш усіх роботів, які мають здатність «будівельник» і кажеш їм будувати стіну. Тобі байдуже, що це за роботи. Хоч робот-поливалка. Якщо він уміє будувати – нехай іде будувати.

Ось як це виглядало б у коді:

Код на Java Опис
static interface WallBuilder {
    void buildWall();
}
— здатність «будівельник стін». Розуміє команду «(по)будувати стіну» — має відповідний метод.
static class РобітникРобот implements WallBuilder {
    public void buildWall() {
        …
    }
}
static class РоботОхоронець implements WallBuilder {
    public void buildWall() {
        …
    }
}
static class Поливалка {
    …
}
— роботи, у яких є ця професія/особливість.

— для зручності я зробив класам імена українською. Таке допускається в java, але вкрай небажано.

— поливалка не має здатності будувати стіни (не реалізує інтерфейс WallBuilder).

public static void main(String[] args) {
   //додаємо усіх роботів у список
    ArrayList robots = new ArrayList(); 
    robots.add(new РобітникРобот());
    robots.add(new РоботОхоронець());
    robots.add(new Поливалка());

    //будувати стіну, якщо є така здатність
    for (Object robot: robots) {
        if (robot instanceof WallBuilder) {
            WallBuilder builder = (WallBuilder) robot;
            builder.buildWall();
        } 
    }
}
— як дати їм команду – побудувати стіну?

— Страшенно цікаво. Навіть не думав, що інтерфейси – така цікава тема.

— А то! Разом з поліморфізмом – це взагалі щось неймовірне.