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

Открыта

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

Интерфейсы — это больше чем интерфейсы — это поведение - 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();
   }
  }
 }
}
— как дать им команду – построить стену?

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

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

Комментарии (119)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Кот Котофеич15 уровень
вчера, 13:50
Последняя табличка - красиво, вот просто чакры открыли и мурашки по спине.
Учиха Шисуи13 уровень, Новосибирск
30 октября, 06:23
Всё еще непонятно..
NomakAnton13 уровень, Казань
25 октября, 04:33
В предыдущей лекции нифига не понял,после этой уже кое что начинает проясняться)
SinPin15 уровень, Санкт-Петербург
24 октября, 13:54
Чёт под прошлой лекцией не спросила. Если интерфейс может наследоваться только от интерфейса, то как он вообще существует в Java, где все наследуется от КЛАССА Object?
Justinian41 уровень, Киев
24 октября, 15:42
Не все. Примитивы же не наследуются от Object? Значит уже не может все. Это кстати затрагивает косвенно тему одного из холиваров, является ли джава чистым ООП языком (все является объект), и что такое вообще чистое ООП и там дальше пошло-поехало. Интерфейс это специальный тип, который имеет свои нюансы. https://stackoverflow.com/questions/6056124/do-interfaces-inherit-from-object-class-in-java
Mouse12 уровень, Ust Kamenogorsk
24 октября, 06:28
- Чертовски интересно непонятно. Даже и не думал, что интерфейсы – такая интересная непонятная тема.
Sergey Lagunov3 уровень, Новосибирск
22 октября, 07:27
А в чем смысл static interface ?
Gulnara Shaikhutdinova16 уровень, Ульяновск
23 октября, 11:38
это просто избыточное указание модификатора static, интерфейс неявно и так является статическим.
Graf Vorontsov14 уровень, Черкассы
20 октября, 09:30
Тебе все равно, что это за роботы. Хоть робот-поливалка. Если он умеет строить – пусть идет строить.
Liliia Kyrylenko15 уровень, Cracow
19 октября, 12:42
походу легкотня заканчивается
Igor Rudnev20 уровень, Новокузнецк
16 октября, 10:32
По этой картинке сразу дошло как использовать интерфейсы
Полина16 уровень
14 октября, 07:14
"WallBuilder builder = (WallBuilder) robot; builder.buildWall();" кто-нибудь, объясните, зачем здесь приведение типа, если мы уже проверили его с помощью instanceOf? Почему нельзя сразу писать robot.buildWall()??
Vladyslav25 уровень
14 октября, 08:43
потому что robot это экземпляр типа Object, смотри внимательно на описание цикла for, а у Object нету метода buildWall(), и если убрать приведение, то компилятор заматериться)