Интерфейсы фактически добавляют некоторую степень динамической гибкости, подобной языку, к статическим языкам, в которых они есть, например, к Java. Они предлагают способ запроса объекта, для которого он реализует контракты во время выполнения .
Эта концепция хорошо переносится на динамические языки. В зависимости от вашего определения слова «динамический», конечно, это даже включает Objective-C, который довольно широко использует протоколы в Какао.
В Ruby вы можете спросить, отвечает ли объект на заданное имя метода. Но это довольно слабая гарантия того, что он будет делать то, что вы хотите, особенно с учетом того, как мало слов используется снова и снова, полная подпись метода не учитывается и т. Д.
В Ruby я могу спросить
object.respond_to? :sync
Так что, да, у него есть метод с именем "sync", что бы это ни значило.
В Objective-C я мог бы спросить что-то похожее, т. Е. «Выглядит ли это / гуляет / крякает как что-то, что синхронизирует?»:
[myObject respondsToSelector:@selector(sync)]
Еще лучше, ценой некоторого многословия, я могу спросить что-то более конкретное, то есть "выглядит ли это / гуляет / крякает как нечто, синхронизирующееся с MobileMe?":
[myObject respondsToSelector:@selector(sync:withMobileMeAccount:)]
Это утка, печатающая до уровня вида.
Но действительно спросить объект, обещает ли он реализовать синхронизацию с MobileMe ...
[receiver conformsToProtocol:@protocol(MobileMeSynchronization)]
Конечно, вы могли бы реализовать протоколы, просто проверив наличие ряда селекторов, которые вы считаете определением протокола / утки, и достаточно ли они конкретны. В какой момент протокол является просто аббревиатурой для большого количества некрасивых responseds_to? запросы и некоторые очень полезные синтаксические сахара для использования компилятором / IDE.
Интерфейсы / протоколы - это еще одно измерение метаданных объекта, которое можно использовать для реализации динамического поведения при обработке этих объектов. В Java компилятор просто требует такого рода вещей для обычного вызова метода. Но даже динамические языки, такие как Ruby, Python, Perl и т. Д., Реализуют понятие типа, которое выходит за рамки просто «на какие методы реагирует объект». Отсюда и ключевое слово класса. Javascript - единственный действительно широко используемый язык без этой концепции. Если у вас есть классы, то интерфейсы тоже имеют смысл.
По общему признанию, это более полезно для более сложных библиотек или иерархий классов, чем в большинстве кодов приложений, но я думаю, что концепция полезна на любом языке.
Кроме того, кто-то еще упомянул миксин. Рубиновые миксины - это способ обмена кодом - например, они связаны с реализацией класса. Интерфейсы / протоколы о интерфейсе класса или объекта. Они действительно могут дополнять друг друга. У вас может быть интерфейс, который определяет поведение, и один или несколько миксинов, которые помогают объекту реализовать такое поведение.
Конечно, я не могу думать о каких-либо языках, которые действительно имеют оба отличных языковых свойства. В тех, у которых есть миксины, включая миксин обычно подразумевает интерфейс, который он реализует.