В объектно-ориентированном программировании тип интерфейса или протокола [a] — это тип данных , который действует как абстракция класса . Он описывает набор сигнатур методов , реализации которых могут быть предоставлены несколькими классами , которые в противном случае не обязательно связаны друг с другом. [1] Класс , который предоставляет методы, перечисленные в протоколе, называется принимающим протокол, [2] или реализующим интерфейс. [1]
Если объекты полностью инкапсулированы, то протокол является единственным способом, которым к ним могут получить доступ другие объекты. Например, в Java интерфейс Comparable
определяет метод compareTo()
, который должны реализовать реализующие классы. Это означает, что метод сортировки, например, может сортировать коллекцию любых объектов типов, которые реализуют интерфейс Comparable, без необходимости знать что-либо о внутренней природе класса (за исключением того, что два из этих объектов можно сравнить с помощью compareTo()
).
Некоторые языки программирования предоставляют явную языковую поддержку протоколов ( Ada , C# , D , Dart , Delphi , Go , Java , Logtalk , Object Pascal , Objective-C , OCaml , PHP , Racket , Seed7 , Swift , Python 3.8). В языках, поддерживающих множественное наследование , таких как C++ , интерфейсы реализованы как абстрактные классы .
В языках без явной поддержки протоколы часто все еще присутствуют как соглашения. Это известно как утиная типизация . Например, в Python любой класс может реализовать __iter__
метод и использоваться как коллекция . [3]
Классы типов в таких языках, как Haskell , или сигнатуры модулей в ML и OCaml используются для многих вещей, для которых используются протоколы. [ необходимо разъяснение ]
В Rust интерфейсы называются трейтами . [4]
Любой тип может принять протокол, который поможет ему получить дополнительную функциональность для выполнения определенного набора задач.
{{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка )