Каково определение “интерфейса” в объектно-ориентированном программировании

Хорошо, мой друг идут назад и вперед на том, что "интерфейс" означает в программировании.

Каково лучшее описание "интерфейса".

Мне интерфейс является проектом класса, действительно ли это - лучшее определение?

101
задан Gnoupi 19 May 2010 в 15:40
поделиться

10 ответов

Интерфейс - один из наиболее перегруженных и сбивающих с толку терминов в разработке.

На самом деле это концепция абстракции и инкапсуляции. Для данного «бокса» он объявляет «входы» и «выходы» этого бокса. В мире программного обеспечения это обычно означает операции, которые могут быть вызваны в поле (вместе с аргументами), и в некоторых случаях типы возвращаемых данных этих операций.

Чего он не делает, так это определения семантики этих операций, хотя обычным явлением (и очень хорошей практикой) является их документирование рядом с объявлением (например, через комментарии) или выбор хороших соглашений об именах. Тем не менее, нет никаких гарантий, что эти намерения будут реализованы.

Вот аналогия: посмотрите на свой телевизор, когда он выключен. Его интерфейс - это кнопки, различные разъемы и экран.Его семантика и поведение таковы, что он принимает входные данные (например, кабельное программирование) и имеет выходы (отображение на экране, звук и т. Д.). Однако, когда вы смотрите на телевизор, который не подключен к розетке, вы проецируете ожидаемую семантику в интерфейс. Насколько вам известно, телевизор может просто взорваться, когда вы его включите. Однако, исходя из его «интерфейса», вы можете предположить, что он не будет готовить кофе, так как в нем нет воды.

В объектно-ориентированном программировании интерфейс обычно определяет набор методов (или сообщений), на которые может отвечать экземпляр класса, имеющего этот интерфейс.

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

В других языках, таких как C ++, у вас нет интерфейсов. Сам класс определяет методы, но вы можете думать об интерфейсе класса как об объявлениях не частных методов. Из-за того, как C ++ компилируется, вы получаете файлы заголовков, где у вас может быть «интерфейс» класса без фактической реализации. Вы также можете имитировать интерфейсы Java с абстрактными классами с чистыми виртуальными функциями и т. Д.

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

161
ответ дан 24 November 2019 в 04:34
поделиться

Как и выше, уместны синонимы "контракт" и "протокол".

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

Так, если класс Cheetos Bag реализует интерфейс Chip Bag, следует ожидать, что Cheetos Bag будет вести себя точно так же, как любой другой Chip Bag. (То есть, раскрывать метод .attemptToOpenWithoutSpillEverywhere() и т.д.)

.
1
ответ дан 24 November 2019 в 04:34
поделиться

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

  • быть уверены, что все члены интерфейса реализованы в производном классе (даже если это просто выброс исключения)
  • Абстрагировать сам класс от вызывающей стороны (привести экземпляр класса к интерфейсу и взаимодействовать с ним без необходимости знать, что на самом деле представляет собой производный класс)

более подробную информацию смотрите здесь http://msdn.microsoft.com/en-us/library/ms173156.aspx

1
ответ дан 24 November 2019 в 04:34
поделиться

На мой взгляд, интерфейс имеет более широкое значение, чем то, которое обычно ассоциируется с ним в Java. Я бы определил "интерфейс" как набор доступных операций с некоторой общей функциональностью, которые позволяют управлять/контролировать модуль.

В этом определении я пытаюсь охватить как программные интерфейсы, где клиентом является некоторый модуль, так и человеческие интерфейсы (например, GUI).

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

1
ответ дан 24 November 2019 в 04:34
поделиться

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

Люди обычно описывают это как «контракт» на то, что должно быть доступно в методах класса.

Это абсолютно не план, поскольку от него также зависит реализация. Можно сказать, что полное определение класса является планом.

1
ответ дан 24 November 2019 в 04:34
поделиться

Технически я бы описал интерфейс как набор способов (методов, свойств, средств доступа ... словарь зависит от языка, который вы используете) для взаимодействия с объектом. Если объект поддерживает / реализует интерфейс, вы можете использовать все способы, указанные в интерфейсе, для взаимодействия с этим объектом.

Семантически интерфейс может также содержать соглашения о том, что вы можете или не можете делать (например, порядок, в котором вы можете вызывать методы) и о том, что, в свою очередь, вы можете предположить о состоянии объекта с учетом того, как вы взаимодействовали до сих пор.

4
ответ дан 24 November 2019 в 04:34
поделиться

Я не думаю, что «чертеж» — это хорошее слово для использования. Чертеж говорит вам, как что-то построить. Интерфейс специально избегает говорить вам, как что-то создать.

Интерфейс определяет, как можно взаимодействовать с классом, т.е. какие методы он поддерживает.

16
ответ дан 24 November 2019 в 04:34
поделиться

Лично я вижу интерфейс как шаблон. Если интерфейс содержит определение методов foo () и bar (), то вы знаете, что каждый класс, который использует этот интерфейс, имеет методы foo () и bar ().

2
ответ дан 24 November 2019 в 04:34
поделиться

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

34
ответ дан 24 November 2019 в 04:34
поделиться

Для меня интерфейс - это план класса, это лучшее определение?

Нет. Чертеж обычно включает внутреннее устройство. Но интерфейс - это исключительно то, что видно снаружи класса ... или, точнее, семейство классов, реализующих интерфейс.

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

7
ответ дан 24 November 2019 в 04:34
поделиться
Другие вопросы по тегам:

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