Существуют ли какие-либо объектно-ориентированные языки программирования , не основанные на парадигме классов?
Существуют ли какие-либо объектно-ориентированные языки программирования , не основанные на парадигме классов?
Ответы:
Насколько я знаю, Self является исходным языком, который изобрел «бесклассовую» парадигму, основанную на прототипах . Он уже существовал (на экспериментальной стадии) в 1980-х годах и доводит изящное использование Smalltalk модели прототипа до предела, так что классы полностью исключаются.
Это повлияло на все другие «классные» ОО языки, которые я знаю:
Такие языки, как JavaScript, основаны на прототипах , где поведение повторно используется путем клонирования существующих объектов. Статья в Википедии, на которую я ссылался, указывает на то, что Lua, ActionScript и ряд других языков следуют этой парадигме.
Самый популярный объектно-ориентированный язык программирования в мире не имеет классов, он называется Javascript и основан на прототипах: http://en.wikipedia.org/wiki/Prototype-based_programming
Объектная ориентация - это общий термин для нескольких важных понятий, которые лишь частично зависят друг от друга. Например, наследование может быть объявлено в каждом конкретном случае между экземплярами, а не между классами, или весь класс может быть представлен конкретным prototype
объектом, как писал Томас. Просто более привычно отделять описание структуры от создания экземпляра. Аналогично, позднее связывание означает, что объекты с номинально одинаковым методом не обязательно делают одно и то же при вызове, и что решение принимается во время выполнения. Это также возможно с подходом на основе прототипа. И инкапсуляция по существу полностью независима от того, являются ли ваши объекты экземплярами объявленных классов или нет.
Тем не менее, большинство языков OO прочно находятся в лагере на базе класса. Но даже в этом случае существуют идиомы, которые стирают черту: дизайн, управляемый доменом, часто приводит к системам, в которых идентичность конкретных объектов гораздо важнее статической диаграммы классов, а декораторы позволяют объектам одного класса или интерфейса иметь очень другое поведение.
Fortress - это объектно-ориентированный язык, основанный на особенностях, а не на классах. Разница в основном в реализации композиции. Поведение объекта (определения методов) все еще определяется объявлениями в определенной точке в тексте программы. Так что в этом смысле это похоже на системы на основе классов.
Существуют объектные исчисления (думаю, Карделли), которые основаны исключительно на объектах. Каждый метод является членом экземпляра. Вы формируете новые объекты, беря содержимое существующего объекта и добавляя, удаляя или заменяя некоторые его элементы. Это немного отличается от прототипов, так как новый объект не имеет ссылки на старый объект, только часть его содержимого.
IIRC, можно программировать аналогичным образом, используя Python и другие языки, ориентированные на хеш-таблицы: вы можете добавить функцию в качестве члена экземпляра, а затем вызвать ее как метод.
Ada, в редакции 1995 года, Ada является объектно-ориентированной, но, в отличие от многих других ОО-языков, она не объединяет объектно-ориентированные типы и модули в одну конструкцию, называемую «класс». Вместо того, чтобы объявлять тип как «class Foo» и помещать все связанные объявления метода внутри объявления класса, вы объявляете пакет и объявляете тип (как a record
) и другие вещи внутри пакета. Это не «бесклассовый» способ, которым обладают некоторые другие упомянутые языки, это просто немного другой способ организации вещей.
Объектно-ориентированные функции Ады 95 были добавлены в существующую версию языка 1983 года; он расширил существующие записи и конструкции пакетов для поддержки наследования и др.
Io - еще один объектно-ориентированный язык на основе прототипов. Это на самом деле черпает вдохновение из нескольких языков, уже упомянутых в других ответах.
Io - это динамический язык программирования, основанный на прототипах. Идеи в Io главным образом основаны на Smalltalk (все значения являются объектами), Self (на основе прототипов), NewtonScript (дифференциальное наследование), Act1 (акторы и фьючерсы для параллелизма), Lisp (код является деревом, которое можно проверить / изменить во время выполнения) и Луа (маленький, встраиваемый).
Erlang. И да, Erlang является объектно-ориентированным языком, так как он удовлетворяет всем трем пунктам определения ОО.