Передача повідомлень - це інший спосіб вирішення потреби в коді OO для одного об'єкта, щоб отримати інший об’єкт (або потенційно сам) зробити щось.
У більшості сучасних мов, які відходять від підходу C ++, ми робимо це з викликами методів. У цьому випадку викликаний об'єкт (через його визначення класу) містить великий список того, який метод викликів він приймає, і тоді кодер виклику об'єкта просто записує виклик:
public void doSomething ( String input )
...
other_object.dosomething ( local )
Для статично набраних мов тоді компілятор може перевірити тип виклику речі та підтвердити, що метод був оголошений. Для динамічно набраних мов тоді це виконується під час виконання.
Але по суті, що відбувається - це те, що пакет змінних відправляється до конкретного блоку коду.
Повідомлення проходить
У мовах передачі повідомлень (таких як Objective C) замість методів є приймачі, але в цілому підхід їх визначення та виклику майже однаковий - різниця полягає у тому, як вони обробляються.
У мові переданого повідомлення компілятор може перевірити, чи існує приймач, який ви назвали, але в гіршому випадку з’явиться попередження, сказавши, що він не впевнений, що його є. Це тому, що під час запуску буде відбуватися те, що блок коду на об'єкті прийому буде називатися, передаючи як пакет змінних, так і підпис приймача, який ви хочете викликати. Потім блок коду шукає приймач і викликає його. Однак якщо приймача не існує, код просто поверне значення за замовчуванням.
В результаті одна з диваків, виявлених при переході з C ++ / Java -> Об'єктив C, розуміє, що ви можете "викликати метод" на об'єкт, який не був оголошений у типі часу компіляції і навіть не існував на тип запуску ... і що виклик не призведе до відкидання виключення, а насправді результат передачі назад.
Переваги такого підходу полягають у тому, що він згладжує ієрахію підкласу та уникає більшості потреб у інтерфейсах / декількох типах успадкування / качок. Він також дозволяє об'єктам визначати поведінку за замовчуванням, коли його просять зробити щось, для чого вони не мають приймача (як правило, "якщо я цього не роблю, пересилайте запит цьому іншому об'єкту"). Він також може спростити зв'язок із зворотними дзвінками (наприклад, для елементів інтерфейсу користувача та приурочених подій), особливо щодо статично типових мов, таких як Java (так що ви можете мати кнопку виклику приймача "runTest", а не викликати метод "actionPerformed" у внутрішньому класі "RunTestButtonListener", який виконує вам дзвінок).
Однак, здавалося б, ціною необхідності додаткової перевірки розробником є те, що дзвінок, який вони думають, що вони здійснюють, знаходиться на потрібному об'єкті з правильним типом і передає правильні параметри в потрібному порядку, тому що компілятор може не попередити вас, і він буде працювати чудово під час виконання (лише повернення відповіді за замовчуванням). Можливо, також є хіт виступу від додаткового огляду та параметри.
У наші дні динамічно набрані мови можуть принести багато переваг повідомленням, що передаються OO, з меншою кількістю питань.