Почему концептуальный интерфейс ОО не представлен ключевым словом в C ++? - PullRequest
7 голосов
/ 26 января 2009

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

Конечно, можно использовать чистый виртуальный класс и пометить его как интерфейс. Однако это ключевое слово кажется настолько полезным и отличается от чистого виртуального класса, что может быть полезным. Возможно, он включен в C ++ 0x?

Ответы [ 8 ]

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

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

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

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

Это избыточно, поскольку интерфейсы представлены так, чтобы каждый член класса был чисто виртуальным (= 0).

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

Добавление ключевого слова "interface" усложнит реализацию без добавления действительно полезных возможностей; это дублирует существующую функциональность. Как уже говорили другие, это просто виртуальный класс. Java и C # должны были иметь «интерфейс», чтобы получить часть того, что уже было в C ++. С философской точки зрения, C ++ предназначен для того, чтобы программисты могли писать хорошие программы, а не для того, чтобы программисты писали плохие программы. По моему опыту, шумиха против MI слишком раздута. Идиоты злоупотребляли этим, как будто они злоупотребляют всем, и вместо того, чтобы обвинять идиотов в том, что они идиоты, люди обвиняли инструмент.

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

Поскольку интерфейс строго слабее, чем МИ.

2 голосов
/ 28 января 2009

Ранние функции OO в C ++ давно игнорировались, поскольку с тех пор он стал более интересным направлением в качестве языка мультипарадигмы. В течение более десяти лет основное внимание уделялось шаблонам и их последствиям, особенно в стандартной библиотеке. Да, программы были бы более удобочитаемыми с ключевым словом interface. Их также было бы проще поддерживать, если бы существовали модификаторы override и new для методов, имена которых совпадают с именами методов базового класса (в стиле C #). Но это не интересные проблемы ни для современных пользователей C ++, ни для тех, кто вносит свой вклад в дизайн языка. Функции OO адекватны, но не велики, и вряд ли используются в «более новых» (после 1992 года) частях стандартной библиотеки, которая в некотором смысле служит руководством для хорошего стиля.

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

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

Кроме того, не все языки должны быть одинаковыми. C ++ имеет свой собственный дизайн и историю, имеет свои сильные и слабые стороны, как Java, C # и все такое. Бесполезно пытаться сделать все языки равными.

0 голосов
/ 28 января 2009

На самом деле концепция ОО «интерфейс» - это операции, которые может выполнять объект.

Таким образом, языки, такие как Ruby или Python, также имеют «интерфейсы», хотя им не нужно объявлять их, как в Java.

В Java концепция интерфейса ОО сопоставляется с этим ключевым словом "интерфейс", используемым для объявления того, что объект будет отвечать на определенный контракт (ряд методов)

C ++ также имеет эту концепцию, и даже каждый объект Java, который не реализует никакого интерфейса.

0 голосов
/ 28 января 2009

Вот короткая статья от DDJ , в которой рассматривается различие между классом и интерфейсом.

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