Являются интерфейсы просто “Синтаксическим Сахаром”?

Я играл главным образом с PHP и Python.

Я читал об Интерфейсах в программировании OO и не вижу преимущества в использовании его.

Несколько объектов могут реализовать тот же интерфейс, но множественное наследование не обеспечивает это также?

Почему я должен создать Интерфейс "без реализации" - главным образом "контракта" - если я могу просто проверить, существует ли метод в объекте в Python, который наследовался нескольким классам?

Интерфейсы были созданы в другом языки, потому что они не обеспечивают множественное наследование? Или я пропускаю что-то более важное здесь?

9
задан Lawrence Johnston 28 June 2010 в 17:53
поделиться

9 ответов

Полезность интерфейса напрямую связана с полезностью статической типизации. Если вы работаете на динамически типизированном языке, таком как PHP или Python, интерфейсы действительно не добавляют значительной выразительности языку. То есть, любая программа, которая может быть описана как использующая интерфейсы, может быть выражена без существенной разницы без использования интерфейсов.

В результате в Python есть довольно туманное понятие "протокола" (реализация, соответствующая определенному шаблону, например, протокол итерации), которое по сути то же самое, но без других преимуществ проверки во время компиляции его ценность ограничена.

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

Без интерфейсов (или эквивалентной формулировки, подобной чистым виртуальным функциям C++) выразительность статически типизированного языка была бы сильно ограничена. На самом деле, существует множество реализаций (на ум сразу приходят Win32 и COM), которые по существу воспроизводят большую часть функциональности интерфейсов и виртуальной диспетчеризации в C путем хранения указателей функций в структурах (и, таким образом, повторной реализации виртуальных функций C++ и вызова vtable вручную). В этом случае возникает большая разница в выразительности, поскольку для выражения тех же концепций требуется много изменений в программе.

Интерфейсы - это лишь один из примеров полиморфизма типов, причем довольно ограниченный. В языках, поддерживающих параметрический полиморфизм (он же дженерики), можно добиться гораздо большего. (Например, LINQ в C# был бы невозможен без родовых интерфейсов). Для более мощной формы того же самого, посмотрите на типовые классы в Haskell.

11
ответ дан 4 December 2019 в 06:22
поделиться

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

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

Теперь для интерфейсов:

В Java есть List в дополнение к массивам. Как правило, массивы предназначены для примитивов (в основном числовых типов), а списки - для объектов.

У меня может быть List , который представляет собой список строк. Я знаю, что могу добавить к нему строк и получить от него строк.

Я не знаю, что это за реализация. Это может быть ArrayList (список, поддерживаемый массивом), LinkedList (список, поддерживаемый двусвязным списком), CopyOnWriteArrayList (поточно-ориентированная версия of ArrayList ) и т. д.

Благодаря полиморфизму и интерфейсам мне не нужно знать, какой тип List он должен делать List операции на нем.

4
ответ дан 4 December 2019 в 06:22
поделиться

Прежде всего, постарайтесь не сравнивать Python и Java. Это разные языки с разной семантикой. Сравнение и противопоставление приведут только к запутанным вопросам, подобным этому, когда вы пытаетесь сравнить то, что Python не использует, с тем, что требует Java.

Это очень похоже на сравнение числа 7 и зеленого цвета. Оба они существительные. Помимо этого, у вас возникнут проблемы со сравнением этих двух.

Вот и суть.

Python не требует интерфейсов.

Java требует их.

Несколько объектов могут реализовывать один и тот же интерфейс, но множественное наследование также не обеспечивает этого?

Эти две концепции почти не имеют ничего общего друг с другом.

Я могу определить большое количество классов, которые имеют общий интерфейс. В Python из-за «утиной печати» мне не нужно тщательно следить за тем, чтобы все они имели общий суперкласс.

Интерфейс - это декларация «намерения» для несвязанных иерархий классов. Он предоставляет общую спецификацию (которая может быть проверена компилятором), которая не является частью простой иерархии классов. Он позволяет множественным иерархиям классов реализовывать некоторые общие функции и быть полиморфными по отношению к этим функциям.

В Python вы можете использовать множественное наследование с нашими интерфейсами без интерфейса. Множественное наследование может включать классы интерфейса или не включать классы интерфейса.

В Java даже нет множественного наследования. Вместо этого он использует совершенно другую технику, называемую «миксинами».

Почему мне нужно создавать Интерфейс «без реализации» - в основном «контракт» - если я могу просто проверить, существует ли метод в объекте в Python, который наследуется от нескольких классов?

Если вы создаете интерфейс в Python, он может быть своего рода формальным контрактом. Утверждение, что все подклассы будут абсолютно выполнять то, что требует интерфейс.

Конечно, тупица лжет совершенно бесплатно. Они могут унаследовать от интерфейса и все неправильно реализовать. Ничто не мешает плохому поведению социопатов.

Вы создаете интерфейс в Java, чтобы позволить нескольким классам объектов иметь общее поведение. Поскольку в Python компилятору мало что известно, эта концепция даже не применима.

Были ли интерфейсы созданы на других языках, потому что они не обеспечивают множественное наследование?

Поскольку понятия не связаны между собой, на это сложно ответить.

В Java они действительно используют «миксин» вместо множественного наследования. «Интерфейс» допускает добавление дополнительных функций. Это одно из применений интерфейса.

Другое использование интерфейса для отделения «есть» от «делает». Иерархия классов определяет, что ЯВЛЯЕТСЯ объектом. Иерархия интерфейса определяет, что ДЕЛАЕТ класс.

В большинстве случаев IS и DOES изоморфны, поэтому различий нет.

В некоторых случаях, что объект ЕСТЬ и что объект ДЕЛАЕТ, различаются.

13
ответ дан 4 December 2019 в 06:22
поделиться

Обычно используется для замены множественного наследования (C #). Я думаю, что некоторые языки / программисты также используют их как способ обеспечения требований к структуре объектов.

0
ответ дан 4 December 2019 в 06:22
поделиться

Да . Что касается PHP, интерфейсы - это просто средство преодоления отсутствия множественного наследования. Есть незначительные семантические различия, полезные для IDE, и меньшее количество конфликтов, вызванных интерфейсами, явно помогает начинающим программистам. Но, как было сказано ранее, это не обязательно для динамических языков. http://c2.com/cgi/wiki?MultipleInheritance

1
ответ дан 4 December 2019 в 06:22
поделиться

Потому что вы хотите программировать на основе интерфейса, а не конкретной реализации (GoF 1995:18)

3
ответ дан 4 December 2019 в 06:22
поделиться

Прочтите статью Twisted Framework о возможностях интерфейсов Zope в python.

1
ответ дан 4 December 2019 в 06:22
поделиться

Даже в языках с утиной типизацией, таких как Python, интерфейс может быть более четким выражением ваших намерений. Если у вас есть несколько реализаций, и они имеют общий набор методов, интерфейс может быть хорошим способом документировать внешнее поведение этих методов, дать концепции имя и сделать концепцию конкретной.

Без явного интерфейса в вашей системе есть важная концепция, которая не имеет физического представления. Это не означает, что вы должны использовать интерфейсы, но интерфейсы обеспечивают эту конкретность".

5
ответ дан 4 December 2019 в 06:22
поделиться

Потому что иногда вы не хотите предоставлять реализацию.

Java интерфейс

Java класс

1
ответ дан 4 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: