Откуда появилась концепция интерфейсов? - PullRequest
10 голосов
/ 19 сентября 2008

В c # у нас есть интерфейсы. Откуда они взялись? Их не было в с ++.

Ответы [ 18 ]

10 голосов
/ 19 сентября 2008

Интерфейсы довольно старые и существуют уже довольно давно.

Ранние (середина и конец конца 1970-х) не объектно-ориентированные языки, такие как Modula и Euclid, использовали конструкции, называемые «модулями», для определения интерфейсов между компонентами. Затем компоненты будут связываться друг с другом через явные модули импорта и экспорта. Интерфейсы в C # являются объектно-ориентированным развитием той же концепции.

Интерфейсы в C # прямо вытекают из концепции интерфейсов в C ++ (и Java), где они использовались как часть COM для описания объектно-ориентированных интерфейсов компонентов.

РЕДАКТИРОВАТЬ: При проведении небольшого количества исследований, самым ранним языком, который я мог найти с явным ключевым словом "interface", был Modula-3, производный от Modula, созданный около 1986 года.

5 голосов
/ 19 сентября 2008

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

3 голосов
/ 19 сентября 2008

У меня сложилось впечатление, что первая формализованная концепция интерфейсов пришла от Objective-C (так называемые "протоколы"). Я могу с уверенностью сказать, что Java по крайней мере получил идею от Objective-C, так что не Java сначала имел интерфейсы.

Электронная почта от Патрика Нотона

3 голосов
/ 19 сентября 2008

Они пришли из Java и были введены потому, что Java (и C #) не допускают множественного наследования.

РЕДАКТИРОВАТЬ: Я получаю некоторые downmods, потому что люди, использующие интерфейсы COM в C ++, не согласны с приведенным выше утверждением. Несмотря на это, концепция интерфейса возникла из java, COM-интерфейсы C ++ были виртуальными классами, java был первым языком, сделавшим его языковой функцией.

КОНЕЦ РЕДАКТИРОВАНИЯ

Например, в C ++ у вас может быть класс с именем Dog, унаследованный от Animal и Mammal.

В C # у вас будет базовый класс с именем Animal, и вы будете использовать интерфейс (IMammal). Обозначение именования I является историческим из C ++ (оно использовалось для обозначения абстрактного виртуального класса) и было перенесено в Java, но более важно в C #, потому что нет простого способа определить, что такое базовый класс и что интерфейс из объявления класса C #:

public class Dog : Animal, IMammal

в то время как в Java это было более очевидно:

public class Dog extends Animal implements IMammal

Множественное наследование очень сложно, поэтому были созданы интерфейсы для его упрощения. Класс C # может наследоваться только от одного базового класса, но может реализовывать N интерфейсов.

В C ++ интерфейсы можно моделировать с использованием чисто виртуальных классов. Они требуют, чтобы все методы были переопределены полиморфно наследующим классом.

2 голосов
/ 19 сентября 2008

Интерфейсы существовали в C ++, если вы занимались программированием COM, и именно здесь происходит соглашение IPrefix.

Хотя сам C ++ изначально не поддерживал интерфейсы, COM / C ++ использовал библиотеки типов, сгенерированные из языка определения интерфейса, который имеет единственное назначение определения интерфейсов, и использовал ключевое слово interface задолго до того, как Java или C # сделали .

Помимо предоставления возможности множественного наследования, мотивация .NET для интерфейсов связана с компонентно-ориентированным происхождением, и его основная цель заключается в определении контрактов между компонентами, которые могут взаимодействовать без какого-либо знания реализаций друг друга. Некоторое COM-взаимодействие также выполняется с интерфейсами .NET.

1 голос
/ 19 сентября 2008

Самая ранняя реализация интерфейсов, о которой я знаю в вычислительной технике, пришла от CORBA.

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

Кстати, хотя они не были созданы для уменьшения проблем с версиями, они, безусловно, могут помочь с ними.

1 голос
/ 19 сентября 2008

Сначала я видел интерфейс с ключевыми словами в java, но он намного старше этого.

такая же концепция существует в c ++, но она не совсем такая же. Они называются «чисто виртуальными классами»

http://en.wikipedia.org/wiki/Virtual_function

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

1 голос
/ 19 сентября 2008

Они существовали в C ++, но они были известны как виртуальные базовые классы, которые состояли только из чисто виртуальных функций. Вот откуда появился префикс «I-» для интерфейсов, чтобы отличать виртуальные базовые классы от абстрактных базовых классов.

1 голос
/ 19 сентября 2008

C ++ допускает множественное наследование. При разработке Java было принято решение об одном наследовании, однако классам было разрешено реализовывать несколько интерфейсов. C # продвинул эту концепцию.

1 голос
/ 26 января 2009

Я думаю, что интерфейсы возникли из-за того, что некоторым программистам надоело писать реализацию метода снова и снова. Сколько раз вы можете написать:

static string Method(int i)

не думая, что должен быть более легкий путь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...