Интерфейсы существуют не как база, на которой могут расширяться классы, а как карта требуемых функций.
Ниже приведен пример использования интерфейса, в котором абстрактный класс не подходит:
Допустим, у меня есть приложение календаря, которое позволяет пользователям импортировать данные календаря из внешних источников. Я бы написал классы для обработки импорта каждого типа источника данных (ical, rss, atom, json). Каждый из этих классов мог бы реализовать общий интерфейс, который обеспечивал бы, чтобы все они имели общие общедоступные методы, которые мое приложение должно получить.
<?php
interface ImportableFeed
{
public function getEvents();
}
Затем, когда пользователь добавляет новый канал можно определить тип Кормят и использовать класс, разработанный для этого типа, чтобы импортировать данные. Каждый класс, написанный для импорта данных для определенного фида, имел бы совершенно другой код, в противном случае между классами может быть очень мало сходства, кроме того, что им требуется реализовать интерфейс, который позволяет моему приложению их потреблять. Если бы я использовал абстрактный класс, я бы очень легко проигнорировал тот факт, что я не переопределил метод getEvents(), который бы тогда разорвал мое приложение в этом экземпляре, тогда как использование интерфейса не позволяло моему приложению запускаться, если ЛЮБОЙ из методов определенные в интерфейсе, не существуют в классе, который его реализовал. Моему приложению не нужно заботиться о том, какой класс он использует для получения данных из фида, только в том, что методы, необходимые для получения этих данных.
Чтобы сделать этот шаг дальше, интерфейс оказывается чрезвычайно полезным, когда я возвращаюсь к своему приложению календаря с целью добавления другого типа фида. Используя интерфейс ImportableFeed, я могу продолжить добавлять дополнительные классы, которые импортируют разные типы каналов, просто добавляя новые классы, реализующие этот интерфейс. Это позволяет мне добавить множество функций, не добавляя излишне объемную часть к моему основному приложению, поскольку мое основное приложение использует только доступные общедоступные методы, которые требуется интерфейсу, так как мои новые классы импорта фида реализуют интерфейс ImportableFeed, а затем я знаю, что я могу просто бросить его на место и продолжать двигаться.
Это очень простой старт. Затем я могу создать другой интерфейс, который может потребоваться для всех классов календаря, который предлагает больше функциональных возможностей, характерных для типа фида, который обрабатывает класс. Другим хорошим примером может служить метод проверки типа подачи и т. Д.
Это выходит за рамки вопроса, но поскольку я использовал приведенный выше пример: Интерфейсы поставляются со своим набором проблем, если они используются таким образом. Мне нужно обеспечить вывод, который возвращается из методов, реализованных в соответствии с интерфейсом, и для этого я использую среду IDE, которая считывает блоки PHPDoc и добавляет возвращаемый тип в виде подсказки типа в блоке PHPDoc интерфейса, который затем перевести на конкретный класс, который его реализует. Мои классы, которые потребляют данные, выводимые из классов, которые реализуют этот интерфейс будет тогда, по крайней мере, знают, что ожидает массив возвращается в этом примере:
<?php
interface ImportableFeed
{
/**
* @return array
*/
public function getEvents();
}
Существует не так много места, в котором сравнить абстрактные классы и интерфейсы. Интерфейсы - это просто карты, которые при реализации требуют, чтобы класс имел набор открытых интерфейсов.
Вы должны прочитать это: http://stackoverflow.com/a/384067/14673 – 2014-08-15 14:20:47
уверен, что это психологическая помощь и коммуникационная помощь. интерфейсы выступают в качестве отличных инструментов обучения для вашего api, поскольку они объединяют службы, которые ваш api предоставляет вместе абстрактным образом, который можно прочитать, не зная о реализации. Это дорого, но, поскольку люди, которые чувствуют себя комфортно с интерфейсом, уже могут использовать функции напрямую, не требуя классов, тем самым сохраняя указатель. без языковых интерфейсов, может быть сложно планировать заранее для многих программистов, поскольку люди, привыкшие к «oop languages», часто предпочитают разрабатывать с интерфейсами, а не на бумаге. – Dmitry 2017-09-16 19:54:45