Чи існують об'єктно-орієнтовані мови програмування, які не засновані на класах?


44

Чи існують об'єктно-орієнтовані мови програмування , які не базуються на парадигмі класів?


1
Технічно кажучи, C. Хоча орієнтація є досить тяжкою у розумінні мови, що полегшує її. Я знаю, що це не той тип відповіді, який ви шукаєте, але якщо ви хочете розглянути, як C може це зробити, це може дати деяке уявлення про те, що насправді займаються класи та як можуть працювати альтернативні підходи.
kylben

4
@kylben: "Орієнтований" - це не вимагається розтягнення. Ви можете заплутати C в об'єктно-орієнтовану поведінку. Ви не можете змусити його орієнтуватися таким чином.
Девід Торнлі

Відповіді:


74

Наскільки я знаю, Self - це оригінальна мова, яка винайшла парадигму "без класу" на основі прототипів . Він вже існував (на експериментальній стадії) у 1980-х роках і підштовхує до витоків елегантне використання прототипу Шатталлака так, що класи повністю виключаються.

Це вплинуло на всі інші мови, що не містять класів, про які я знаю:

  • найбільш видатний Javascript,
  • класична мова програмування та середовище Squeak (яка побудована на вершині Smalltalk)
  • мова сценарію мульти-парадигми Lua .

2
@Adam: без статичного введення, чи це ВСЕ просто синтаксичний цукор?
кевін клайн

5
@DeadMG OO - це не та, яка дає змогу реалізувати ідеї ОО, але така, яка робить це для вас :)
Piotr Dobrogost

4
Насправді, і у Simula (1960), і в Smalltalk-71 (а також у Smalltalk-72) теж не було класів, які передували самоті майже три десятиліття. Заняття додавали лише у Simula-67 та Smalltalk-74 (а Алан Кей вважав їх помилкою, а точніше - необхідним злом).
Йорг W Міттаг

2
@kevincline: Не впевнений, на чому ви базуєтесь; OO та статична типізація є повністю ортогональними.
Пол Біґгар

2
Окрім Simula (яка взяла на себе парадигму класу) Смак був представлений на MIT в 1979 році і був попередником CLOS, обидва з них передували Self.
Меттью Флінн

32

Такі мови, як JavaScript, засновані на прототипах , де поведінку повторно використовують шляхом клонування існуючих об'єктів. Стаття у Вікіпедії, до якої я посилався, вказує, що Lua, ActionScript та ряд інших мов дотримуються цієї парадигми.


2
Будь-який варіант ECMAScript використовує парадигму прототипу.
zzzzBov

Ну, майже будь-який варіант. ActionScript (мова Flash) використовує класи, хоча базовий VM може реалізовувати їх з точки зору прототипів.
mjfgates

@mjfgates, Actionscript 2 раніше використовувався на основі ECMAScript і багато нагадував Javascript. Actioncript 3 відходить від цього, але все ще зберігає свою динамічну природу. Ви можете сильно / слабко ввести будь-яку змінну, оскільки по суті все є Об'єктом.
J_A_X

13

Найпопулярніша об'єктно-орієнтована мова програмування у світі не має класів, вона називається Javascript і заснована на прототипі: http://en.wikipedia.org/wiki/Prototype-based_programming


11
"Найпопулярніша об'єктно-орієнтована мова програмування у світі"? Я взагалі не впевнений у цій претензії.
Томас Оуенс

8
@ThomasOwens, завдяки її включенню до Інтернету, ви можете легко сказати, що кожна сучасна веб-платформа (включаючи мобільні пристрої) включає в себе інтерпретатор JavaScript. Це дуже вагомий випадок, що це в даний час найпопулярніша прототипова мова в існуванні. (якщо ви не думаєте, що можете зробити подібний аргумент для "SELF")
riwalk

1
Javascript, безумовно, є однією з найбільш широко використовуваних мов програмування у світі, але я б очікував, що більшість звичаїв є простим старим імперативом або процедурним, з, можливо, трохи аспектно-орієнтованим програмуванням (зворотні виклики? AJAX? Обробники подій?) Тут і там називати javascript "найпопулярнішою мовою OOP" не зовсім виправдано.
tdammers

9
Я б також сказав "всюдисущий", щоб уникнути дискусії щодо достоїнств його популярності.
Ентоні Пеграм

3
@ Stargazer712: Мені не подобається бути мовним фанатом, але він стверджує, що "найпопулярніша об'єктно-орієнтована мова програмування у світі [ed: Javascript] не має класів". Його можна розкласти з двох тверджень: "Javascript - найпопулярніша об'єктно-орієнтована мова програмування" та "У JavaScript немає класів"; і те, і інше, я згоден.
Лі Лі Райан

6

Об'єктна орієнтація - це парасольовий термін для кількох важливих понять, які лише частково залежать один від одного. Наприклад, успадкування може бути оголошено у кожному конкретному випадку між екземплярами, а не між класами, або весь клас може бути представлений конкретним prototypeоб'єктом, як писав Томас. Просто звичніше відокремлювати опис структури від створення екземпляра. Аналогічно, пізнє прив'язування означає, що об'єкти з номінально одним і тим же методом не обов'язково роблять те саме, коли він викликається, і що рішення приймається під час виконання. Це також можливо при підході до прототипу. І інкапсуляція по суті повністю не залежить від того, ваші об'єкти є примірниками оголошених класів чи ні.

Однак, більшість мов ООС надійно перебувають у таборі на базі класів. Але навіть тоді є ідіоми, які розмивають лінію: дизайн, керований доменом, часто призводить до систем, в яких ідентичність конкретних об'єктів набагато важливіша, ніж статична діаграма класів, а декоратори дозволяють об'єктам одного класу чи інтерфейсу мати дуже інша поведінка.


6

Фортеця - об’єктно-орієнтована мова, заснована на ознаках замість класів. Різниця полягає головним чином у складі реалізації. Поведінка об'єкта (визначення методу) все ще визначається деклараціями в конкретному пункті тексту програми. Тож у цьому сенсі це схоже на класові системи.

Є об'єктні калькуляції (за Карделлі, я думаю), які суто базуються на об'єктах. Кожен метод є членом екземпляра. Ви формуєте нові об’єкти, беручи вміст існуючого об'єкта і додаючи, видаляючи або замінюючи деяких його членів. Він трохи відрізняється від прототипів, оскільки новий об’єкт не має зв’язку зі старим об’єктом, лише деяким його вмістом.

IIRC, можна програмувати аналогічним чином за допомогою Python та інших мов, орієнтованих на хешбел: ви можете додати функцію як член екземпляра, а потім викликати її як метод.


5

Ada, станом на свою ревізію 1995 року, Ada є об'єктно-орієнтованою, але, на відміну від багатьох інших мов OO, вона не поєднує об'єктно-орієнтовані типи та модулі в єдину конструкцію, що називається "клас". Замість того, щоб оголосити тип "класом Foo" і помістити всі пов'язані з ним декларації методу всередині декларації класу, ви оголосите пакет і оголосите тип (як а record) та інші речі всередині пакета. Це не "без класу" у тому, як деякі інші згадані мови, це просто трохи інший спосіб організації речей.

Об'єктно-орієнтовані функції Ada 95 були додані до існуючої версії мови 1983 року; він розширив існуючі записи та пакети для підтримки успадкування та ін.


це те, що я запам’ятав, також вам потрібно передати свій запис кожному функціонеру
Nikko

@Nikko: Це те, що відбувається за лаштунками в кожній об'єктно-орієнтованій мові, і досить явно в Python та CLOS (звичайний lisp).
Марцін

5

Io - ще одна об'єктно-орієнтована мова, заснована на прототипі. Це насправді черпає натхнення з кількох мов, про які вже говорилося в інших відповідях.

Io - динамічна мова програмування на основі прототипу. Ідеї ​​в Io в основному надихають Smalltalk (усі значення об'єктів), Self (заснований на прототипі), NewtonScript (диференційне успадкування), Act1 (актори та ф'ючерси на одночасність), Lisp (код - дерево, яке можна перевіряти / змінювати) та Луа (невелика, вбудовувана).


4

Ерланг. І так, Ерланг - це об'єктно-орієнтована мова, оскільки вона виконує всі три моменти визначення ОО.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.