Чи існують об'єктно-орієнтовані мови програмування , які не базуються на парадигмі класів?
Чи існують об'єктно-орієнтовані мови програмування , які не базуються на парадигмі класів?
Відповіді:
Наскільки я знаю, Self - це оригінальна мова, яка винайшла парадигму "без класу" на основі прототипів . Він вже існував (на експериментальній стадії) у 1980-х роках і підштовхує до витоків елегантне використання прототипу Шатталлака так, що класи повністю виключаються.
Це вплинуло на всі інші мови, що не містять класів, про які я знаю:
Такі мови, як JavaScript, засновані на прототипах , де поведінку повторно використовують шляхом клонування існуючих об'єктів. Стаття у Вікіпедії, до якої я посилався, вказує, що Lua, ActionScript та ряд інших мов дотримуються цієї парадигми.
Найпопулярніша об'єктно-орієнтована мова програмування у світі не має класів, вона називається Javascript і заснована на прототипі: http://en.wikipedia.org/wiki/Prototype-based_programming
Об'єктна орієнтація - це парасольовий термін для кількох важливих понять, які лише частково залежать один від одного. Наприклад, успадкування може бути оголошено у кожному конкретному випадку між екземплярами, а не між класами, або весь клас може бути представлений конкретним prototype
об'єктом, як писав Томас. Просто звичніше відокремлювати опис структури від створення екземпляра. Аналогічно, пізнє прив'язування означає, що об'єкти з номінально одним і тим же методом не обов'язково роблять те саме, коли він викликається, і що рішення приймається під час виконання. Це також можливо при підході до прототипу. І інкапсуляція по суті повністю не залежить від того, ваші об'єкти є примірниками оголошених класів чи ні.
Однак, більшість мов ООС надійно перебувають у таборі на базі класів. Але навіть тоді є ідіоми, які розмивають лінію: дизайн, керований доменом, часто призводить до систем, в яких ідентичність конкретних об'єктів набагато важливіша, ніж статична діаграма класів, а декоратори дозволяють об'єктам одного класу чи інтерфейсу мати дуже інша поведінка.
Фортеця - об’єктно-орієнтована мова, заснована на ознаках замість класів. Різниця полягає головним чином у складі реалізації. Поведінка об'єкта (визначення методу) все ще визначається деклараціями в конкретному пункті тексту програми. Тож у цьому сенсі це схоже на класові системи.
Є об'єктні калькуляції (за Карделлі, я думаю), які суто базуються на об'єктах. Кожен метод є членом екземпляра. Ви формуєте нові об’єкти, беручи вміст існуючого об'єкта і додаючи, видаляючи або замінюючи деяких його членів. Він трохи відрізняється від прототипів, оскільки новий об’єкт не має зв’язку зі старим об’єктом, лише деяким його вмістом.
IIRC, можна програмувати аналогічним чином за допомогою Python та інших мов, орієнтованих на хешбел: ви можете додати функцію як член екземпляра, а потім викликати її як метод.
Ada, станом на свою ревізію 1995 року, Ada є об'єктно-орієнтованою, але, на відміну від багатьох інших мов OO, вона не поєднує об'єктно-орієнтовані типи та модулі в єдину конструкцію, що називається "клас". Замість того, щоб оголосити тип "класом Foo" і помістити всі пов'язані з ним декларації методу всередині декларації класу, ви оголосите пакет і оголосите тип (як а record
) та інші речі всередині пакета. Це не "без класу" у тому, як деякі інші згадані мови, це просто трохи інший спосіб організації речей.
Об'єктно-орієнтовані функції Ada 95 були додані до існуючої версії мови 1983 року; він розширив існуючі записи та пакети для підтримки успадкування та ін.
Io - ще одна об'єктно-орієнтована мова, заснована на прототипі. Це насправді черпає натхнення з кількох мов, про які вже говорилося в інших відповідях.
Io - динамічна мова програмування на основі прототипу. Ідеї в Io в основному надихають Smalltalk (усі значення об'єктів), Self (заснований на прототипі), NewtonScript (диференційне успадкування), Act1 (актори та ф'ючерси на одночасність), Lisp (код - дерево, яке можна перевіряти / змінювати) та Луа (невелика, вбудовувана).
Ерланг. І так, Ерланг - це об'єктно-орієнтована мова, оскільки вона виконує всі три моменти визначення ОО.