Інтерфейс (об'єктно-орієнтоване програмування)
В об'єктно-орієнтованому програмуванні протокол або інтерфейс є звичайним засобом для незв'язаних об'єктів спілкуватися один з одним. Це визначення методів та цінностей, з яким об'єкти погоджуються для співпраці.
Наприклад, у Java, де протоколи називаються інтерфейсами, інтерфейс Comparable визначає метод compareTo()
, який реалізовані класи повинні виконувати. Це означає, що окремий метод сортування, наприклад, може сортувати будь-який об'єкт, який реалізує інтерфейс Comparable, без необхідності знати будь-що про внутрішню природу класу (крім того, що два з цих об'єктів можна порівняти за допомогою compareTo()
).
Протокол є описом:
- Повідомлень, які розуміються об'єктом.
- Аргументів, якими можуть надаватися ці повідомлення.
- Типів результатів, до яких ці повідомлення повертаються.
- Інваріантів, які зберігаються попри модифікації стану об'єкта.
- Виняткових ситуацій, які вимагатимуть клієнтів обробляти об'єкт.
Якщо об'єкти повністю інкапсульовані, то протокол описує єдиний спосіб доступу до цих об'єктів іншими об'єктами.
Деякі мови програмування забезпечують явну мовну підтримку протоколів або інтерфейсів (Ada, C#, D, Dart, Delphi, Go, Java, Logtalk, Object Pascal, Objective-C, PHP, Racket, Seed7, Swift). У C++ інтерфейси відомі як абстрактні базові класи і реалізовані за допомогою чистих віртуальних функцій. Об'єктно-орієнтовані функції Perl також підтримують інтерфейси.
Попри те, що Go загалом не розглядається як об'єктно-орієнтована мова програмування, вона дозволяє визначати методи на типи, визначені користувачем. Go має типи "інтерфейсу", сумісні з будь-яким типом, який підтримує певний набір методів (для цього типу не потрібно явно вводити інтерфейс). Порожній інтерфейс interface{}
сумісний з усіма типами.
Функціональне програмування та розподілені мови програмування також мають поняття протоколу, значення якого тонко відрізняється (тобто специфікація дозволеного обміну повідомленнями, акцент на обмін, а не на повідомлення). Ця різниця обумовлена дещо різними припущеннями функціонального програмування та парадигмами об'єктно-орієнтованого програмування. Зокрема, наступні також розглядаються як частина протоколу на таких мовах:
- Допустимі послідовності повідомлень;
- Обмеження, що покладаються на одного учасника зв'язку;
- Очікувані ефекти, які відбудуться під час обробки повідомлення.
Класи типу в мовах, таких як Haskell, використовуються для багатьох речей, для яких використовуються і протоколи.