В объектно - ориентированном программировании тип интерфейса или протокола [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: отсутствует местоположение издателя ( ссылка )