В понятийном аппарате разработчика есть такое слово - интерфейс. Это сложная идея. Среднему человеку, входящему в профессию, нужно иметь довольно большой контекст, чтобы на интуитивном уровне понимать её смысл, и очень часто на собеседовании проверяют, насколько человек улавливает этот смысл.
Когда я говорю об интерфейсе как об идее - я делаю это намеренно, акцентируя внимание на том, что в реальности идеального примера интерфейса не существует и никогда не будет.
Говоря коротко и в самом общем смысле - интерфейс это то, при помощи чего осуществляется коммуникация. Интерфейс включает в себя механизм валидации данных. Из самых простых и распространенных примеров, который я могу привести - язык, на котором мы говорим.
В процессе речи человек произносит звуки ртом. Эти звуки достигают другого человека, он интерпретирует их согласно тому, какие интерфейсы ему доступны (русский, английский, китайский). Если собеседник не знает языка - валидация не пройдена, коммуникация не случилась.
Если смотреть на вложенность понятий, то язык - это подмножество интерфейсов, работающих со знаками и символами. А API - это подмножество языков, из которого выкинули всё лишнее (эмоции, метафоры, контекст). API - это формальный язык, адаптированный для общения программ.
Таким образом, бесконечно широкое понятие «интерфейс» схлопывается в технически узкое понятие «API».
Понимание идеи интерфейсов - это буквально ключ к пониманию всего ООП.
Если расположить все ключевые свойства ООП в порядке их отношения к интерфейсу, то абстракция стоит на первом месте.
Абстракция - решение, что объект значит. Интерфейс - решение, как с ним говорить. Без абстракции интерфейс - это просто непривязанные ни к чему методы. Без интерфейса абстракция - объект, которым нельзя воспользоваться.
Свойство инкапсуляции (сокрытия данных и объединения их с методами) выходит из того, что интерфейс - это граница между системами. Чтобы была граница, должно быть то, что она отделяет. Если у объекта нет внутренней, скрытой части, то ему не нужны методы для управления этой частью. А следовательно - интерфейс не нужен. Инкапсуляция создает ту самую двуслойность, без которой интерфейс теряет смысл.
Если инкапсуляция - прямое и неизбежное следствие существования границы, то наследование и полиморфизм - это следствия существования разных интерфейсов и необходимости их совмещать.
Без интерфейсов наследование не нужно. Можно просто копировать код. Наследование возможно только потому, что у класса есть четкая граница (интерфейс), которую можно расширить, не ломая старую. Когда мы наследуем класс, мы берем его публичные методы как основу и говорим: «пусть у нового класса будет всё то же самое и еще немного».
Полиморфизм - это ответ на вопрос: «Можно ли общаться с разными объектами через один и тот же интерфейс?». Он существует потому, что мы можем договориться о единых правилах взаимодействия. Разные объекты могут иметь одинаковые методы. Если бы у каждого объекта был свой уникальный способ взаимодействия, полиморфизм был бы невозможен.
Без понимания идеи интерфейса становится сложно влиться в современное программирование.
P.S. Спасибо за внимание. У меня нет опыта в публикации. Понимаю, что возможно сухо написано - за это простите. Прошу вас, поделитесь этим материалом, если считаете, что он оказался вам полезен, или вы знаете людей, которым он может быть полезен. Обещаю улучшить качество в будущих публикациях.