tl; dr: Ви можете мати спадщину без OO, ви можете мати капсуляцію без OO, ви можете мати поліморфізм без OO, ви можете навіть всі три одночасно без OO. На зворотному боці ви можете мати ОО без спадкування. Крім того, існують різні види інкапсуляції (орієнтовані на ADT та OO); IOW не всі інкапсуляції є OO.
Довга версія:
Термін "Об'єктно-орієнтоване програмування" був винайдений Аланом Кей, тому він отримує рішення про те, що це означає. І він визначає це так :
OOP для мене означає лише обмін повідомленнями, локальне збереження та захист та приховування державно-процесу, а також надзвичайне запізнення всіх речей.
По мірі впровадження, обмін повідомленнями - це запізнілий виклик процедури, і якщо виклики процедури запізніли, то ви не можете знати в час проекту, що ви збираєтесь викликати, тому ви не можете робити жодних припущень щодо конкретного подання стану. Отже, насправді мова йде про обмін повідомленнями, пізнє зв’язування - це реалізація повідомлень, а інкапсуляція є наслідком цього.
Пізніше він уточнив, що " велика ідея - це" обмін повідомленнями ", і шкодує, що назвав її" об'єктно-орієнтованою "замість" орієнтованою на повідомлення ", оскільки термін" об'єктно-орієнтований "ставить акцент на неважливу річ (об'єкти) ) і відволікає від того, що дійсно важливо (обмін повідомленнями):
Лише ніжне нагадування про те, що я взяв певні болі на останньому OOPSLA, щоб спробувати нагадати всім, що Smalltalk - це не лише НЕ його синтаксис чи бібліотека класів, мова навіть не про класи. Мені шкода, що я давно придумав для цієї теми термін «об’єкти», оскільки це змушує багатьох людей зосередитися на меншій ідеї.
Велика ідея - це "обмін повідомленнями" - саме про це і полягає ядро Smalltalk / Squeak (і це те, що ніколи не було завершено в нашій фазі Xerox PARC). У японців є невелике слово - ma - для "того, що знаходиться між ними" - можливо, найближчий англійський еквівалент "interstitial". Ключове значення у створенні чудових та розростаючих систем - це набагато більше, щоб розробити, як його модулі спілкуються, а не якими мають бути їх внутрішні властивості та поведінка. Подумайте про Інтернет - щоб жити, він (а) повинен дозволити безліч різних ідей та реалізацій, що виходять за межі будь-якого єдиного стандарту, та (b) дозволяти різного ступеня безпечної взаємодії між цими ідеями.
(Звичайно, сьогодні більшість людей навіть не зосереджуються на предметах, а на заняттях, що ще більше неправильно.)
Повідомлення є основним для ОО як метафори, так і як механізму.
Якщо ви надіслаєте комусь повідомлення, ви не знаєте, що вони з ним роблять. Тільки річ , яку ви можете спостерігати, їх відповідь. Ви не знаєте, чи обробляли вони повідомлення самостійно (тобто, якщо об’єкт має метод), чи пересилали повідомлення комусь іншому (делегування / надання доступу), якщо вони навіть розуміли його. Ось в чому полягає інкапсуляція, ось про що йдеться ОО. Ви навіть не можете відрізнити проксі від реального, якщо він відповідає, як ви цього очікуєте.
Більш "сучасним" терміном "обмін повідомленнями" є "динамічне відправлення методу" або "віртуальний виклик методу", але це втрачає метафору і фокусується на механізмі.
Подібні пункти також в On Розуміння абстракції даних, Revisited по Вільям Р. Кук , а також його пропозиція щодо спрощення, сучасні визначення «об'єкта» і «об'єктно - орієнтованого» .
Динамічна відправка операцій є суттєвою характеристикою об'єктів. Це означає, що операція, яку слід викликати, є динамічною властивістю самого об'єкта. Операції неможливо ідентифікувати статично, і взагалі немає можливості точно визначити, яку операцію буде виконано у відповідь на заданий запит, за винятком її виконання. Це точно так само, як і з першокласними функціями, які завжди динамічно розсилаються.
У Smalltalk-72 навіть об’єктів не було! Були лише потоки повідомлень, які були розібрані, переписані та перепрограні. Спочатку з'явилися методи (стандартні способи розбору та перенаправлення потоків повідомлень), пізніше з'явилися об'єкти (групування методів, які поділяють деякий приватний стан). Успадкування з'явилося набагато пізніше, і заняття були запроваджені лише як спосіб підтримки спадщини. Якби дослідницька група Кей вже знала про прототипи, вони, ймовірно, ніколи б не вводили заняття в першу чергу.
Кожен програміст повинен прочитати « Розуміння абстрагування даних», переглянутий . Це докладно пояснює, у чому саме різниця полягає між об'єктами та абстрактними типами даних. Він наводить приклади, використовуючи Java, і це надзвичайно актуально для цього питання, оскільки і в прикладах ADT, і в об'єктних прикладах він використовує успадкування, інкапсуляцію та поліморфізм, але лише один із прикладів об'єктно-орієнтований! Іншими словами: у вас може бути спадщина, інкапсуляція та поліморфізм, ви навіть можете мати всіх трьох одночасно і все ще не мати ОО.
З іншого боку, ви можете мати ОО без спадкування. Як я натякав вище: оригінальні версії Smalltalk (мова, розроблена Аланом Кей, винахідником терміна "Об'єктно-орієнтоване програмування") не мали успадкування.
Останнє, але, безумовно, не менш важливе, Орландоський договір обговорює делегування як альтернативу спадщині та те, як різні форми делегування та успадкування призводять до різних пунктів дизайну в просторі дизайну об'єктно-орієнтованих мов. (Зауважте, що насправді навіть мовами, які підтримують успадкування, як, наприклад, Java, людей насправді вчать уникати цього, знову ж таки вказуючи, що це не потрібно для ОО.)