IceJOKER
@IceJOKER
Web/Android developer

ООП — Как понимать Интерфейсы в java?

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

Так вот к примеру, чтоб в android добавить поддержку клика на кнопке, то один из способов реализации - указать что идет поддержка интерфейса ViewSetOnClickListener и добавить слушатель, так вот чего я не могу понять, почему так делается?

Что случается, когда добавляется поддержка интерфейса?

Вроде бы понимаю, как работают интерфейсы, а вроде бы и нет...
  • Вопрос задан
  • 4953 просмотра
Решения вопроса 1
@ProkletyiPirat
идея
смотрите, вы создаёте объект "Кнопка" и этот объект может изменять своё состояние (нажата кнопка да\нет это и есть состояние). Другие программисты в других проектах будут использовать ваш объект "Кнопка", и эти программисты хотят что бы при изменение состояния что то происходило. При этом вы не знаете что именно должно происходить во всех этих проектах (это знают только их разработчики).

как это можно сделать?
убогая банальщина: вы делаете метод .получитьТекущееСостояние() и другие программисты в каком-то цикле опрашивают вашу кнопку через этот метод, да ещё и хранят предыдущее состояние (надо же с чем то сравнивать). Как видите довольно убого... пользователю-программисту нужно писать кучу кода с проверками и в добавок тратить впустую память и время процессора (то есть программа лагает и жрёт дохрена ресурсов...).

нормальная реализация: пусть сама кнопка вызывает нужные действия, веть она же знает когда её состояние изменилось. Значит кнопка должна вызывать какую-то функцию но при этом не знать что именно эта функция должна делать. Вот тут и приходят на помощь интерфейсы и паттерны проектирования в данном случае Listeners (aka Observers). Вот как раз OnClickListener это и есть интерфейс. Что касается кнопки то она хранит список объектов которые нужно уведомить при изменении состояния, тип этих объектов "OnClickListener". Таким образом "Кнопке" плевать "что где и как" должно происходить при изменении состояния, но при этом она обеспечивает возможность выполнения этого "что где и как" и при этом гарантирует что не произойдёт ошибки из за отсутствия вызываемого метода.

ru.wikibooks.org/wiki/Java/Listeners
citforum.ru/SE/project/pattern
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
Интерфейсы позволяют избегать множественного наследования, грубо говоря. Но, не в этом суть. Интерфейс - это группа методов, которые определяют некоторое поведение. То есть, если класс реализует интерфейс - "наполняет" его методы содержанием, это значит, что он наделяется некоторыми способностями. Например, если класс реализует интерфейс Stack с методами push и pop, то он наделяется поведением стека (не смотря на то, что эти методы делают на самом деле, т.е. не обязательно объектами этого класса можно пользоваться, как стеком). Это позволяет абстрагироваться от класса, и отталкиваться только от того, реализует ли класс данного объекта определенный интерфейс или нет.
Ответ написан
Sild
@Sild
Интерфейс обязывает реализующий класс придерживаться некоего поведения.
Если ты реализуешь интерфейс, то есть гарантия, что все методы, описанные в интерфейсе, будут доступны пользователю (под пользователем понимается программист, использующий реализующий класс). И ему нет необходимости знакомиться с логикой метода, важно только знать что у объекта этот метод точно есть.
Это связано не столько с ООП, сколько с архитектурой приложения в целом.
Ответ написан
VYakushev
@VYakushev
Разработчик Android в Nowtaxi
Приведу пример на базе упрощенной биржи фриланса. Есть класс разработчик, и есть класс заказчик. У каждого из них свои интересы и задачи. Разработчик может выполнять какие-то работы, а какие-то нет.
1. Поэтому он у себя в резюме пишет, что он, к примеру, может разрабатывать приложения для Android (объявляет интерфейс Android-разработчик).
2. На бирже он находит всех заказчиков, которые раньше давали заказы под Android. Пишет им в личку и говорит, что если что готов рассмотреть их предложения и выполнить работы (подписывается как слушатель).
3. Однажды у заказчика возникает идея приложения. Он поднимает список своих контактов и находит тех, кто может разрабатывать под Android (то есть своих "слушателей"). И рассылает им сообщения.

Пример не совсем полный, но я старался показать что интерфейс - это своего рода контракт. Класс говорит, что я хотел бы принимать определенные события от других классов и у меня есть всё необходимое для этого. Интерфейс описывает как раз, какие методы должен содержать класс, чтобы реагировать на нужные события.
Ответ написан
OnYourLips
@OnYourLips
Интерфейс показывает, что класс отвечает всем его требованиям, либо программа не скомпилируется.
Любой класс можно использовать по типу его интерфейса. При этом не важно, какой это класс.
Ответ написан
trerums
@trerums
Допустим, вы выбираете новый двигатель для своего старого автомобиля. Чтобы знать что он подойдет вам нужно знать требуемые размеры двигателя, наличие всех разъемов,кабелей и прочего, которые требует корпус авто. Вот эти требования и есть интерфейс и не важно поставите вы туда движок от камаза или еще чего, лишь бы все состыковалось как требуется. Надеюсь хоть чутку прояснил ситуацию :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы