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

Открыта

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

Интерфейсы — это больше чем интерфейсы — это поведение - 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
{
...
}
— класс «скейтборд». Обладает способностью передвигаться и управляться человеком.
3
Задача
Java Core,  2 уровень,  8 лекция
Недоступна
Набираем код Ӏ Java Core: 2 уровень, 8 лекция
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();
   }
  }
 }
}
— как дать им команду – построить стену?

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

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

Комментарии (216)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Игорь Кривцов
14 уровень, Санкт-Петербург
9 апреля, 08:44
самое простое и понятное объяснение интерфейса это, как контракт на работы... у нас большой проект и мы знаем что у нас в программе будет разная мебель, классы(объекты) по разной мебели будут писать разные люди и в разное время. И в интерфейсе Мебель мы определяем те методы, которые там, в создаваемых в будущем классах разной мебели, должны быть, например метод "Сборка мебели", мы не указываем каких и сколько должно быть переменных, это программист решит сам, мы просто говорим, если вы реализуете класс, который унаследуется от мебели, то в нем должен быть метод по сборке мебели "Сборка мебель" - будь добр реализуй.... То же самое можно сделать и при помощи абстрактного класса, но в Java разрешено унаследовать только от одного класса, а унаследование от интерфейсов не ограничено.
Aleksey Grin
13 уровень, Санкт-Петербург
5 апреля, 09:48
GospodinNoskov
14 уровень, Москва
4 апреля, 11:20
лишняя скобка } в последнем примере
Ivan None
28 уровень
2 апреля, 05:17
"Ты просто берешь всех роботов, у которых есть способность «строитель» и говоришь им строить стену. Тебе все равно, что это за роботы. Хоть робот-поливалка. Если он умеет строить – пусть идет строить". Бедный робот-поливалка :) Улыбнуло
Дмитрий
17 уровень, Москва
20 февраля, 15:13
По интерфейсам советую данное видео https://www.youtube.com/watch?v=quANdsdnPns&t=604s и эту статью https://metanit.com/java/tutorial/3.7.php, ну и в книгах покопаться, чтобы лучше усвоить материал.
Юлия
12 уровень
18 февраля, 17:10
Я еще только в начале "светлого" пути и пока интерфейсы воспринимаю как цветовую дифференциацию штанов. Если класс implements малиновые штаны, сразу понятно чего от него ждать
Микита
16 уровень, Киев
12 февраля, 12:56
"для удобства я сделал классам имена на русском." Но "лектор" этой статьи вроде как девушка...🤨
GospodinNoskov
14 уровень, Москва
4 апреля, 11:25
видимо это метод класса-родителя или интерфейса ))) сделал()
Olexandr Dombrovskyi
25 уровень, Киев
29 января, 15:10
Пока плохо понятно зачем это все, но идем дальше!
Mr Notorious
16 уровень, Санкт-Петербург
27 января, 15:38
Интересно, а почему в последнем примере не написать просто for (Object robot: robots) { if (robot instanceof WallBuilder) { robot.buildWall(); } } Зачем явно приводить объекты к типу WallBuilder? Ведь сами объекты по идее уже должны иметь метод buildWall().
EM1LJAN
18 уровень
1 февраля, 10:52
тоже недопонимание, по идее говорилось ранее что все методы в интерфейсе публичны, поэтому как понимаю можно заменить на robot.buildWall(); но также, говорилось что интерфейс схож с абстрактным классом, и видимо поэтому нужно добавлять: WallBuilder builder = (WallBuilder) robot; как и в обычный класс Cat cat = new Cat();
Evgeny Tretyakov
18 уровень, Новосибирск
27 февраля, 09:56
Потому что у класса Object не определен метод buildWall(), значит, ссылку типа Object надо сдаункастить до типа WallBuilder и на ней уже вызвать метод buildWall().
🦔 Виктор веду Java Android канал в telegram @LetsCodeItExpert
24 декабря 2020, 16:29
Now we're talking! Совсем другое дело, общий принцип и концепция понятна, наглядные примеры, спасибо. Теперь можно приступать к задачам и отрабатывать ключевое слово interface ; ) Дополнительные материалы про интерфейсы: Видео-урок от Алишева про интерфейсы. Разница между абстрактными классами и интерфейсами. Интерфейсы для тех кому "очень интересно, но ничего не понятно". Для чего в Java нужны интерфейсы. Всё получится!