В Java или C ++ отсутствуют какие-либо функции OO? - PullRequest
8 голосов
/ 16 марта 2010

Я заинтересован в понимании объектно-ориентированного программирования более академичным и абстрактным способом, чем я в настоящее время, и хочу знать, существуют ли какие-либо объектно-ориентированные концепции, которые Java и C ++ не могут реализовать.

Я понимаю, что ни один из языков не является "чистым" ОО, но меня интересует, что (если вообще что-то) им не хватает, а не то, что у них есть.

Ответы [ 9 ]

15 голосов
/ 16 марта 2010

В слова Алана Кея , изобретателя термина «объектная ориентация»:

ООП для меня означает только обмен сообщениями, локальный удержание и защита и сокрытие государственного процесса и экстрима поздняя привязка всех вещей. Может быть сделано в Smalltalk и в LISP. Там возможно, другие системы, в которых это возможно, но я не в курсе их.

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

Другие интересные заявления из того же письма:

Мне не понравилось, как Симула I или Simula 67 сделал наследство [...] Так что я решил оставить наследство как встроенная функция, пока я ее не понял лучше.

и

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

8 голосов
/ 16 марта 2010

С макушки головы я бы сказал:

3 голосов
/ 16 марта 2010

Оба делают различие между примитивами и объектами, поэтому ни один не является чисто объектно-ориентированным.

2 голосов
/ 16 марта 2010

Существует еще один способ думать об объектно-ориентированном программировании, который отличается от систем на основе классов в Java и C ++. Программирование на основе прототипов используется JavaScript. Если вы хотите взглянуть на всю гамму стилей ООП, возможно, стоит взглянуть на: http://en.wikipedia.org/wiki/Prototype-based_programming

1 голос
/ 19 марта 2010

Единственной наиболее важной особенностью объектно-ориентированного программирования является инкапсуляция. Сокрытие деталей реализации, очевидно, имеет решающее значение для написания поддерживаемого кода.

В C ++, поскольку у вас есть неконтролируемые указатели, один плохо написанный объект может буквально что-то делать другому. Это означает, что инкапсуляция нарушена, и ошибки трудно найти.

У Java такой проблемы нет, но ей не хватает базового постоянства. Это не строго объектно-ориентированная теоретическая особенность, но возможность объявить, что метод только для чтения или объект только для чтения, является фантастическим средством повышения надежности в C ++, которого нет в Java.

Наконец, механизм шаблонов java - бледная имитация C ++. Неспособность параметризовать классы - огромная потеря для Java.

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

1 голос
/ 16 марта 2010

Java: примитивные типы не являются объектами.

1 голос
/ 16 марта 2010

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

Множественное наследование подвергалось критике за следующие проблемы, которые оно вызывает в определенных языках, в частности в C ++:

  • Семантическая неоднозначность часто обобщается как проблема алмаз .
  • Невозможно явно наследовать несколько раз из одного класса
  • Порядок изменения класса наследования Семантика
0 голосов
/ 16 марта 2010

Большинство интерпретируемых языков отвечают требованиям позднего связывания. В Perl вы можете извлечь код из таблицы базы данных, бросить его в интерпретатор, а затем создать объекты нового класса, который вы только что ввели в программу.

Питон полностью соответствует определению Кей ООП? Я не сделал достаточно работы в Python, чтобы быть уверенным. Я подозреваю, что нет, поскольку в Python есть «нативные типы», которые не являются объектами.

0 голосов
/ 16 марта 2010

Java и C ++ допускают процедурное программирование. Это может считаться минусом для некоторых людей.

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