Хорошо, мой друг идут назад и вперед на том, что "интерфейс" означает в программировании.
Каково лучшее описание "интерфейса".
Мне интерфейс является проектом класса, действительно ли это - лучшее определение?
Интерфейс - один из наиболее перегруженных и сбивающих с толку терминов в разработке.
На самом деле это концепция абстракции и инкапсуляции. Для данного «бокса» он объявляет «входы» и «выходы» этого бокса. В мире программного обеспечения это обычно означает операции, которые могут быть вызваны в поле (вместе с аргументами), и в некоторых случаях типы возвращаемых данных этих операций.
Чего он не делает, так это определения семантики этих операций, хотя обычным явлением (и очень хорошей практикой) является их документирование рядом с объявлением (например, через комментарии) или выбор хороших соглашений об именах. Тем не менее, нет никаких гарантий, что эти намерения будут реализованы.
Вот аналогия: посмотрите на свой телевизор, когда он выключен. Его интерфейс - это кнопки, различные разъемы и экран.Его семантика и поведение таковы, что он принимает входные данные (например, кабельное программирование) и имеет выходы (отображение на экране, звук и т. Д.). Однако, когда вы смотрите на телевизор, который не подключен к розетке, вы проецируете ожидаемую семантику в интерфейс. Насколько вам известно, телевизор может просто взорваться, когда вы его включите. Однако, исходя из его «интерфейса», вы можете предположить, что он не будет готовить кофе, так как в нем нет воды.
В объектно-ориентированном программировании интерфейс обычно определяет набор методов (или сообщений), на которые может отвечать экземпляр класса, имеющего этот интерфейс.
Путаницу усугубляет то, что в некоторых языках, таких как Java, существует реальный интерфейс с семантикой, зависящей от языка. В Java, например, это набор объявлений методов без реализации, но интерфейс также соответствует типу и подчиняется различным правилам ввода.
В других языках, таких как C ++, у вас нет интерфейсов. Сам класс определяет методы, но вы можете думать об интерфейсе класса как об объявлениях не частных методов. Из-за того, как C ++ компилируется, вы получаете файлы заголовков, где у вас может быть «интерфейс» класса без фактической реализации. Вы также можете имитировать интерфейсы Java с абстрактными классами с чистыми виртуальными функциями и т. Д.
Интерфейс, безусловно, не является планом для класса. План по одному определению - это «подробный план действий».Интерфейс ничего не обещает о действии! Источник путаницы заключается в том, что на большинстве языков, если у вас есть тип интерфейса, который определяет набор методов, класс, который его реализует, «повторяет» те же методы (но предоставляет определение), поэтому интерфейс выглядит как скелет или план класса.
Как и выше, уместны синонимы "контракт" и "протокол".
Интерфейс включает в себя методы и свойства, которые, как вы можете ожидать, будут открыты классом.
Так, если класс Cheetos Bag
реализует интерфейс Chip Bag
, следует ожидать, что Cheetos Bag
будет вести себя точно так же, как любой другой Chip Bag
. (То есть, раскрывать метод .attemptToOpenWithoutSpillEverywhere()
и т.д.)
Интерфейс определяет, что должен реализовать класс, который от него наследуется. Таким образом, несколько классов могут наследоваться от интерфейса, и благодаря этому наследованию вы можете
более подробную информацию смотрите здесь http://msdn.microsoft.com/en-us/library/ms173156.aspx
На мой взгляд, интерфейс имеет более широкое значение, чем то, которое обычно ассоциируется с ним в Java. Я бы определил "интерфейс" как набор доступных операций с некоторой общей функциональностью, которые позволяют управлять/контролировать модуль.
В этом определении я пытаюсь охватить как программные интерфейсы, где клиентом является некоторый модуль, так и человеческие интерфейсы (например, GUI).
Как уже было сказано другими, интерфейс всегда имеет некоторый контракт за собой, в терминах входов и выходов. Интерфейс ничего не обещает о том, "как" выполняются операции; он только гарантирует некоторые свойства результата, учитывая текущее состояние, выбранную операцию и ее параметры.
Интерфейс отделяет операции над классом от внутренней реализации. Таким образом, некоторые реализации могут предоставлять множество интерфейсов.
Люди обычно описывают это как «контракт» на то, что должно быть доступно в методах класса.
Это абсолютно не план, поскольку от него также зависит реализация. Можно сказать, что полное определение класса является планом.
Технически я бы описал интерфейс как набор способов (методов, свойств, средств доступа ... словарь зависит от языка, который вы используете) для взаимодействия с объектом. Если объект поддерживает / реализует интерфейс, вы можете использовать все способы, указанные в интерфейсе, для взаимодействия с этим объектом.
Семантически интерфейс может также содержать соглашения о том, что вы можете или не можете делать (например, порядок, в котором вы можете вызывать методы) и о том, что, в свою очередь, вы можете предположить о состоянии объекта с учетом того, как вы взаимодействовали до сих пор.
Я не думаю, что «чертеж» — это хорошее слово для использования. Чертеж говорит вам, как что-то построить. Интерфейс специально избегает говорить вам, как что-то создать.
Интерфейс определяет, как можно взаимодействовать с классом, т.е. какие методы он поддерживает.
Лично я вижу интерфейс как шаблон. Если интерфейс содержит определение методов foo () и bar (), то вы знаете, что каждый класс, который использует этот интерфейс, имеет методы foo () и bar ().
Интерфейс - это контракт, который вы должны соблюдать или выполнять, в зависимости от того, являетесь ли вы разработчиком или пользователем.
Для меня интерфейс - это план класса, это лучшее определение?
Нет. Чертеж обычно включает внутреннее устройство. Но интерфейс - это исключительно то, что видно снаружи класса ... или, точнее, семейство классов, реализующих интерфейс.
Интерфейс состоит из сигнатур методов и значений констант, а также (обычно неформального) «поведенческого контракта» между классами, реализующими интерфейс, и другими, которые его используют.