Интерфейсы — это больше чем интерфейсы — это поведение

Открыта

— Привет, Амиго! А вот и снова я. Хочу рассказать тебе еще об одном взгляде на интерфейсы. Понимаешь, класс – это, чаще всего модель какого-то конкретного объекта. Интерфейс же больше соответствует не объектам, а их способностям или ролям.

Интерфейсы — это больше чем интерфейсы — это поведение - 1

Например, такие вещи, как машина, велосипед, мотоцикл и колесо лучше всего представить в виде классов и объектов. А такие их способности как «могу ездить», «могу перевозить людей», «могу стоять» — лучше представить в виде интерфейсов. Смотри пример:

Код на Java Описание
interface Moveable
{
void move(String newAddress);
}
— соответствует способности передвигаться.
interface Driveable
{
void drive(Driver driver);
}
— соответствует способности управляться водителем.
interface Transport
{
void addStaff(Object staff);
Object removeStaff();
}
— соответствует способности перевозить грузы.
class Wheel implements Moveable
{
...
}
— класс «колесо». Обладает способностью передвигаться.
class Car implements Moveable, Drivable, Transport
{
...
}
— класс «машина». Обладает способностью передвигаться, управляться человеком и перевозить грузы.
class Skateboard implements Moveable, Driveable
{
...
}
— класс «скейтборд». Обладает способностью передвигаться и управляться человеком.
14
Задача
Java Core,  2 уровень,  8 лекция
Недоступна
Набираем код
Иногда думать не надо, строчить надо! Как ни парадоксально звучит, порой пальцы «запоминают» лучше, чем сознание. Вот почему во время обучения в секретном центре JavaRush вы иногда встречаете задания на набор кода. Набирая код, вы привыкаете к синтаксису и зарабатываете немного материи. А ещё — боретесь с ленью.

Интерфейсы сильно упрощают жизнь программиста. Очень часто в программе тысячи объектов, сотни классов и всего пара десятков интерфейсов – ролей. Ролей мало, а их комбинаций – классов – очень много.

Весь смысл в том, что тебе не нужно писать код для взаимодействия со всеми классами. Тебе достаточно взаимодействовать с их ролями (интерфейсами).

Представь, что ты – робот-строитель и у тебя в подчинении есть десятки роботов, каждый из которых может иметь несколько профессий. Тебе нужно срочно достроить стену. Ты просто берешь всех роботов, у которых есть способность «строитель» и говоришь им строить стену. Тебе все равно, что это за роботы. Хоть робот-поливалка. Если он умеет строить – пусть идет строить.

Вот как это выглядело бы в коде:

Код на Java Описание
static interface WallBuilder
{
void buildWall();
}
— способность «строитель стен». Понимает команду «(по)строить стену» — имеет соответствующий метод.
static class РабочийРобот implements WallBuilder
{
void buildWall()
 {}
}
static class РоботСторож implements WallBuilder
{
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();
   }
  }
 }
}
— как дать им команду – построить стену?

— Чертовски интересно. Даже и не думал, что интерфейсы – такая интересная тема.

— А то! В совокупности с полиморфизмом – это вообще бомба.

Комментарии (132)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Женя13 уровень, Витебск
вчера, 08:18
WallBuilder builder = (WallBuilder) robot; Динамическая диспетчеризация: набор методов определяется типом переменной, ок тип WallBuilder и для него определен метод buildWall();. А реализация метода определяется типом обьекта ссылку на который хранит переменная. Мы приводим робота к типу WallBuilder, а в интерфейсе WallBuilder нет реализации метода buildWall(); Подскажите, что я не понял?
Leha Yakimkin13 уровень, Москва
вторник, 19:09
Кто-нибудь понял зачем в последней проге написано " WallBuilder builder = (WallBuilder) robot;" Хочется понять почему надо так , а не просто rrobot.buildWall(); . Ведь в каждом классе с интерфейсом WallBuilder, метод buildWall определен, или это на случай, что где-то может быть не определен?
Justinian41 уровень, Киев
позавчера, 09:22
В предыдущих лекциях было указано, ТИП ссылочной переменной определяет набор ДОСТУПНЫХ для вызова методов и обращения к полям объекта у робота какой тип ссылочной переменной? Object. В классе Object нету метода buildWall, поэтому вызвать мы не можем.
alex13 уровень
вторник, 17:59
чет я не фига не понял зачем нужен этот интерфейс в чем отличие от классов, кроме того, что методы не описаны? что бы иметь возможность организовать множественное наследование?
Андрей14 уровень, Волгоград
10 января, 05:57
"– это вообще бомба." =)
Graf Vorontsov17 уровень, Черкассы
9 января, 13:50
Есть над чем подумать, идём дальше..
Константин18 уровень, Москва
26 декабря 2019, 23:22
огонь вообще, становится более интересней)
Vsevolod15 уровень, Atlas
13 декабря 2019, 11:48
[bugreport] interface Transport stAff - это персонал. а "вещи" - это stUff
Дмитрий22 уровень, Пермь
8 декабря 2019, 01:23
Рекомендую к просмотру ролик Человек достаточно хорошо объясняет с примерами из практики для чего вообще нужны эти все интерфейсы и абстрактные классы. Подсел на его плейлист по Java параллельно с курсом JavaCore
Gavrosh14 уровень, Calgary
8 января, 22:37
спасибо за ссылку
Oleg Makievsky15 уровень, Минск
23 ноября 2019, 11:42
«Тебе все равно, что это за роботы. Хоть робот-поливалка. Если он умеет строить – пусть идет строить.» — это всё что надо знать о странах бывшего СССР. Лучше и скажешь. «Даже и не думал, что интерфейсы – такая интересная тема.» 😛
Кот Котофеич23 уровень
12 ноября 2019, 13:50
Последняя табличка - красиво, вот просто чакры открыли и мурашки по спине.