Обсуждение:Интерфейс (объектно-ориентированное программирование)

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

О чём статья?[править код]

Универсального для всех языков программирования понятия «интерфейс» не существует. Поскольку речь в статье, похоже, идёт о COM-интерфейсах, то нужно это явно отразить в определении и в статье. —CodeMonk 21:29, 20 мая 2006 (UTC)

Сейчас я сам определение уже переделал. —CodeMonk 22:02, 20 мая 2006 (UTC)

Почему это нет. Интерфейс это и есть интерфейс. Пользовать интерфейсы можно и без COM. — Эта реплика добавлена участником Kolan (о · в) 10:44, 21 мая 2006‎ (UTC)

Дай пояснение что такое COM интерфейс(если сможешь тк я незнаю что ты имел в виду) и сделай сюда ссылку с Интерфейс (программирование) — Эта реплика добавлена участником Kolan (о · в) 10:50, 21 мая 2006‎ (UTC)

поэтому иногда образно говорят, что интерфейс — это контракт, который обязуется выполнить класс. - Ничего не иногда а всегда. Раз класс подписался должен выполнить. — Эта реплика добавлена участником Kolan (о · в) 10:53, 21 мая 2006 (UTC)

Интерфейс задаётся абстрактным классом - В Delphi это не так… — Эта реплика добавлена участником Kolan (о · в) 10:53, 21 мая 2006‎ (UTC)

И кста. в Delphi до 2006 вообще небыло абстрактных классов… — Эта реплика добавлена участником Kolan (о · в) 10:56, 21 мая 2006 (UTC)

Но в Delphi были абстрактные методы. С точки зрения OOA&D абстрактным считается класс, имеющий хотя бы один абстрактный метод. Поэтому, как это принято в некоторых языках, при наличии абстрактных методов указывать еще абстрактным и сам класс - тавтология. --Чобиток Василий 20:39, 28 ноября 2006 (UTC)
Про COM-интерфейсы хорошо написано в первой главе вот этого документа и вот здесь о программировании COM-интерфейсов. —CodeMonk 19:31, 21 мая 2006 (UTC)
Я не понимаю, что значит «Интерфейс это и есть интерфейс». Если имеется в виду просто набор публичных функций и свойств класса, то в статье это не прописано, и вообще не надо об этом отдельную статью писать. И при чём здесь тогда интерфесы в Delphi? А универсального для всех языков программирования понятия «интерфейс» не существует, как я уже писал. Как мне кажется, эта статья либо должна быть переименована и серьёзно переработана, либо удалена. —CodeMonk 19:31, 21 мая 2006 (UTC)

По-моему, разбить статью поспешили[править код]

По-моему, разбить статью поспешили. COM-интерфейсы — это такие же ООП-интерфейсы, как и в ООП-языках, и статья должна была рассказывать об интерфейсах от общего к частному. Муть, написанную в статье Interface (шаблон), надо, почистив, перенести в статью о шаблонах проектирования. С другой стороны, к программированию относится и совсем другое понятие Интерфейс программирования приложений. —М. Ю. 03:26, 23 мая 2006 (UTC)

Я бы взялся доработать статью до нормального вида, начиная с истории интерфейсов и заканчивая почему именно они позволили ООП стать инструментом интеграции систем, открыли ворота для действительно сложных, расширяемых проектов. Конкретные примеры имплементации, ИМХО, несущественны, и должны занимать не больше 30% статьи. Но дайте мне знать, что вы не удалите ее, а то вся работа пойдет насмарку :) Пока сделал набросок локально в текстовом файле, до 1го июня берусь закочить. Exceeder 04:08, 24 мая 2006 (UTC)
Я мешать не буду Kolan 16:09, 24 мая 2006 (UTC)

Об определениях[править код]

Интерфейс (Inter — «взаимо» и face — «поверхность»).
Я бы предположил: inter — «между», а face — «лицо».
Интерфейс определяет границу между спецификацией того, что делает абстракция, и реализацией того,  как она это делает.
У меня извилин не хватает, чтобы осмыслить эту гениальную фразу. Что это значит? По-моему это глупость какая-то.
Интерфейс — это набор операций, используемых для специфицирования услуг, предоставляемых классом
или компонентом.
Это относится к COM-интерфейсам. Но это плохо сформулировано.
Проще говоря, интерфейс — это контракт, который обязуется выполнить класс.
Так говорят о классах, наследующих COM-интерфейсы. Но не о любом классе и интерфейсе в программировании можно так сказать. —CodeMonk 21:34, 22 мая 2006 (UTC)
А можно пример интерфейса, который не контракт? Хочу быть уверен что я ничего не упустил. Exceeder 16:36, 27 мая 2006 (UTC)
Можно сказать, что если класс наследует COM-интерфейс, то он обязуется, «подписывается» реализовать этот интерфейс. Потому что если абстрактные элементы интерфейса не будут реализованы, то код просто не будет компилироваться. Если под интерфейсом понимать просто совокупность публичных свойств и методов класса, то я не вижу никакого основания называть это контрактом. «Пример интерфейса, который не контракт»: ну, например, с какой стати API называть контрактом? --CodeMonk 17:31, 27 мая 2006 (UTC)
Согласен, API - это точно не контракт. Но любой интерфейс в ООП - контракт. Именно потому что ВСЕ абстрактные элементы интерфейса должны быть реализованы, в соответствии с семантикой языка. Или я что-то сильно упустил. Таким образом важно подчеркнуть, что в этой статье, в контексте ООП, интерфейс - контракт, тогда как в широком смысле интерфейса - нет. Exceeder 02:06, 29 мая 2006 (UTC)
Так что именно вы подразумеваете под интерфейсом в ООП? Наследуемые COM-интрефейсы и какое-то их подобие, или совокупность публичных свойств и методов класса, или get/put методы для всех свойств по теории инкапсуляции? Что именно? Где дано определение? --CodeMonk 17:30, 30 мая 2006 (UTC)
Ничего из этого. Хотя COM-интерфейсы достаточно близки по сути, но решают совершенно другую задачу и не являются языковой конструкцией. И я бы вообще убрал секцию про Дельфи, просто не я ее писал, еще думаю, можно ли ее как-то переработать (в смысле сносок на похожие, но другие конструкции). Интерфейс - это семантическая конструкция в языке, прежде всего. Кроме правил взаимодействия, она определяет тип данных, при этом не являясь корнем дерева наследования классов. Именно поэтому интерфейс решает проблему редактирования базового класса. Точное определение дано в первых двух строках. В настоящий момент C#, VB.NET, Java и еще ряд языков имеют "полноценные" интерфейсы. С++ и Дельфи (до Дельфи.NET) их не имеют. Exceeder 18:47, 30 мая 2006 (UTC)
Ну то есть под интерфейсом вы понимаете просто абстрактный класс. А как же тогда единое для всего ООП понятие интерфейса? --CodeMonk 16:24, 31 мая 2006 (UTC)
Иногда для определения интерфейса действительно применяют определение "полностью абстрагированный абстрактный класс" [1], т.е. абстрактный класс без намека на "как" что-то будет работать, только "что" должно быть предоставлено. Однако я против такого определения, оно запутывает понимание того, что интерфейсы ВСЕГДА вне иерархии наследования классов и являются дополнительной конструкцией, не имеющей аналогов в С++, к примеру. Впрочем, как уточненние, фразу имеет смысл вставить в статью. Exceeder 17:09, 31 мая 2006 (UTC)
В С++ только нет такого ключевого слова, но такую функциональность можно реализовать без проблем. А что Вы подразумеваете под «интерфейсы ВСЕГДА вне иерархии наследования классов»? Они ведь и предназначены для наследования. --CodeMonk 18:47, 31 мая 2006 (UTC)

Объясню[править код]

— Эта реплика добавлена участником Kolan (о · в) 09:13, 23 мая 2006‎ (UTC)

У меня извилин не хватает, чтобы осмыслить эту гениальную фразу. Что это значит? По-моему это глупость какая-то. Это довольно точное определение.

границу между спецификацией того, что делает абстракция - граница между описание/определением...

и реализацией того, как она это делает - и как это на самом деле делается...

Простой пример. Недавна видел рекламу какой-то компаннии, занимающейся междугородей телефонной связью.

Цитирую по памяти: «Чтобы позвонить по телефону ван не нужно быть специалистом по комуникациям».

Тоесть ты знаещь как тыкать в кнопки - это интерфейс, а какт там дальше телефон работает, как работает АТС итд тебя вообще не волнует - это реализация.

Это относится к COM-интерфейсам. Но это плохо сформулировано. В ООП вообще есть понятие интерфейса. Интерфес COM — это частный случай.

Но не о любом классе и интерфейсе в программировании можно так сказать Согласен, но статья относится не «программирование», а «объектно-ориентированное программирование»!

Для ясности специально сделал: Интерфейс (программирование).

Эту глупую фразу про «спецификацию того, что делает абстракция» нужно из статьи убрать. Ваш пример про специалиста по коммуникациям иллюстрирует понятие полиморфизма и инкапсуляции, но не оправдывает это абсурдное определение интерфейса. Пожалуйста, подписывайтесь под своими репликами. --CodeMonk 17:47, 27 мая 2006 (UTC)

В английской версии[править код]

— Эта реплика добавлена участником Kolan (о · в) 09:16, 23 мая 2006‎ (UTC)

An interface defines the communication boundary between two entities - интерфейс определяет границу между двумя сущностями.

Кстати очень похоже на:

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

Только у них это по computer scince, а тут я чисто про ООП написал

Совершенно не похоже. Пожалуйста, подписывайтесь под своими репликами. --CodeMonk 17:35, 27 мая 2006 (UTC)

Помогите правильно структурировать[править код]

Я еще новичек в Wiki, поэтому прошу гуру правильно структурировать знания по Интрефейсу. Нужно начать с самого Интрефейса, дальше Интерфейс (программирование), а это понятие для ООП считаю верным. — Эта реплика добавлена участником Kolan (о · в) 09:20, 23 мая 2006 (UTC)

Другие определения понятия "Интерфейс"[править код]

Предлогаю оставлять здесь подходящие определения

  • Интерфейс - тип данных, представляющий абстрактное описание публичных свойств и методов класса. — Эта реплика добавлена участником Kolan (о · в) 10:53, 23 мая 2006 (UTC)

Объединение со статьей COM-интерфейс[править код]

К сожалению, у меня нет сейчас времени заняться определениями, но я уверен, что эта статья должна быть "крышей" и для COM-интерфейсов, предлагаю подумать над объединением. Может, удастся позаимствовать определение из той статьи и не говорить в определении о коде и о синтаксисе. Интерфейс - это абстракция с методами и свойствами, а синтаксис неважен. --М. Ю. 10:22, 31 мая 2006 (UTC)

Вот у меня точка зрения, что как раз интерфейс в ООП - это синтаксическая конструкция какого-нибудь языка (хотя конкретный синтаксис неважен, действительно). А СОМ - это что-то совершенно иное, потому что OLE - это наборы указателей на интерфейсы плюс GUIDы. С точки зрения ООП, в COMе нет ООП части. Инкапсуляция не требуется и не регламентируется, наследование отсутствует, полиморфизм невозможен. Скорее, я бы перенес из ООП-интерфейса многое в СОМ. Но я еще поищу материалы, подтверждающие или опровергающие мою точку зрения. Exceeder 12:31, 31 мая 2006 (UTC)
Ну, не совсем так. COM - не вполне полноценное ООП, но понятия "класс" и "интерфейс" играют в нем роли, аналогичные тем, что в ООП, и различаются только способом внутренней реализации. Например, нельзя использовать интерфейс без объекта класса. Наследование интерфейсов в какой-то мере тоже есть, и класс может "наследовать" (реализовывать) один или более интерфейсов, точно как в каком-нибудь C#. В общем, в этом понятии в языках и в COM есть что-то концептуально общее, а разница - в его реализации. --М. Ю. 13:01, 31 мая 2006 (UTC)
Я покопался в литературе, возможно вы правы. И кажется, эти две статьи есть смысл объединить. В общем, начинать нужно в любом случае с матчасти - источников и ссылок. Английская версия всего того же (набора статей про интерфейсы) мне не нравится совсем - там неразбериха. Немецкая лучше, но тоже нуждается в доработке. Остальные вряд ли прольют свет, так что я занимаюсь подборкой литературы. Одна из моих любимых статей на эту тему(нем., PDF) [[2]] которую я частично переводил [[3]] Exceeder 15:54, 31 мая 2006 (UTC)

Интерфейсы в Delphi[править код]

— Эта реплика добавлена с IP 212.12.29.89 (о) 23:56, 17 августа 2006‎ (UTC) [Учаснег: Тестер]. Народ, скажите в статье нормально мою мысль (править боюсь). В Delphi (и не только в ней!) интерфесы не привязаны к COM, термин "интерфейс" в ПО появлися раньше COM. Просто концепция COM построена на интерфейсах. В начале статьи дано грамотное описание интерфейса. А в статье про Delphi говорится, что интерфейсы в ней являются следствием необходимости поддержки COM :(. Это далеко не так. Т.е., надо сказать, что интерфесы [в Delphi] отдельно, а COM - отдельно, но, в силу своей организации, COM их юзает. Кстати, интерфейсы есть и в Kylix, где COM'а "нет" :)

Описание интерфейсов[править код]

— Эта реплика добавлена с IP 212.12.29.89 (о) 00:12, 18 августа 20066‎ (UTC) [Учаснег: Тестер] А где что-нибудь в этом разделе сказано про IDL? Все конструкции в разделе, насколько я понял, наны на нем. К аффтару: жжешь. Писши на Rider1982@mail.ru. Обсудим тонкости

Раздел "Интерфейсы и абстрактные классы"[править код]

Все же интерфейс и абстрактный класс, это разные семантические сущности.

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

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

Так что предлагаю переписать данный раздел, ввиду того, что интерфейс и абстрактный класс НЕ являются аналогичными сущностями. — Gigahard 11:21, 21 июня 2009 (UTC)

Вопрос участнику Fractaler[править код]

Скажите пожалуйста, а что конкретно Вас смущает в данном определении интерфейса, что Вы так настойчиво ставите шаблон "ссылка ни источник" и "АИ"? Вы считаете, что в данном определении что то не так? Поясните пожалуйста.— Gigahard 08:11, 4 августа 2009 (UTC)

это семантическая и синтаксическая конструкция в коде программы, используемая для специфицирования услуг, предоставляемых классом или компонентом. Для начала - какой программы? Fractaler 15:03, 4 августа 2009 (UTC)
Извините, не понял сути вопроса... Вы действительно не понимаете, о какой программе идет речь? Даже в рамках этой статьи? — Gigahard 19:07, 4 августа 2009 (UTC)
  • Хорошо, давайте начнём с перечислений. 1) Программа на Си попадает под определение? Fractaler 08:34, 7 августа 2009 (UTC)
А для чего? В данном случае слово программа не привязана к какому либо конкретному языку. Для любого языка, поддерживающего объектно-ориентированный подход, все будет применимо. Вы не начинайте с дальнего края. Что конкретно Вас не устраивает в определении? — Gigahard 10:14, 7 августа 2009 (UTC)
Ок, подставляем значение в переменную, получаем по вашему определению: Интерфейс - это семантическая и синтаксическая конструкция в коде программы на СИ, используемая для специфицирования услуг, предоставляемых классом или компонентом. Всё верно? Fractaler 00:13, 8 августа 2009 (UTC)
Си не является объектно-ориентированным языком. Определение интерфейса в объектно ориентированном контексте к нему не применимо. Но допустим речь идет о C++ то в таком случае определение вполне верно. Что собственно Вас смущает? — Gigahard 22:30, 10 августа 2009 (UTC)
Си не является объектно-ориентированным языком - множество код программы включает подмножество "Код программы на языке программирования Си". Но допустим речь идет... - это вы каждому читателю собираетесь объяснять? Fractaler 07:25, 11 августа 2009 (UTC)
Вы заголовок статьи читали? Понимаете какие языки программирования применимы к данной статье (какое подмножество применимо к статье по теме объектно-ориентированого программирования)? И в четвертый раз спрашиваю, что Вам не нравится в этом определении? Ответьте по пунктам с аргументацией (...не верно, потому что...). Иначе создается впечатление, что Вы просто не в теме обсуждаемого предмета — Gigahard 10:31, 11 августа 2009 (UTC)
  • А, понял - вы считаете, что заголовка статьи достаточно для того, что бы потом в определениях ничего уже не уточнять? Fractaler 18:21, 11 августа 2009 (UTC)
  • Ага. Вопрос уже задали — добавлю сюда. Откуда такое определение интерфейса, еще и с "семантической конструкцией"? Где определение семантической конструкции? Я подозреваю, что это — чистой воды орисс. РоманСузи 19:38, 11 ноября 2013 (UTC)

Поправка про множественное наследование[править код]

Благодаря наличию множественного наследования, ничто не мешает реализовать в одном классе несколько интерфейсов, если в этом есть необходимость Насколько я вижу, конкретно в данном примере множественное наследование никак не рассматривается. RippleSax 13:41, 27 ноября 2015 (UTC)