协议 (面向对象编程)

协议（Protocol）是特定面向对象编程语言使用的术语，具有各种特殊含义，在其他语言中可能称为接口或trait。

概述
协议指示着在调用者和对象之间的交互链，在其他方面都类同于通信协议。使用术语“协议”的语言包括：Clojure、Elixir、Java 8、、Objective-C、Smalltalk-80、Swift、Python。

在这些语言中，协议是离散的对象相互通信的常用方式。为了进行协作，将这些对象一致认可的方法和值的定义，作为API的一部份。协议/接口描述了：
 对象所理解的消息。
 这些消息可提供的实际参数。
 这些消息返回的结果的类型。
 ，即使对象状态被修改了而仍然保持。
 异常情况，要求这个对象的客户处理。
 （只针对通信风格用途：）方法的调用序列和决定点，这些都会表示在UML交互图中：、时序图、交互概述图/活动图、计时图。

如果对象是完全封装的，则协议将只描述对象能被其他对象访问的方式。例如Java中的接口，Comparable接口指定了一个方法compareTo()，实现类必须实现它。这意味着比如有一个独立的排序方法，可以排序实现了这个可比较接口的任何对象，而不用知道关于这个类的内部性质的任何事情（除了两个这种对象可以通过compareTo()方式进行比较之外）。

一些编程语言提供对协议/接口的显式的语言支持：Ada、C#、D、Dart、Delphi、Go、Java、、Object Pascal、Objective-C、PHP、Racket、、Swift。在C++中接口叫做抽象基础类，并被使用纯虚函数实现。Perl中的面向对象特征也支持接口。

非面向对象语言 

尽管Go编程语言一般不被认为是面向对象语言，它允许在用户定义类型上定义方法。Go有“接口”类型，兼容于支持给定方法集合的任何类型（这个类型不需要显式的实现这个接口）。空接口interface{}兼容于所有类型。

注意函数式编程和分布式编程语言使用术语协议类似于通信用法（比如允许消息交换的规定强调了交换而非消息）。特别是在这些语言中如下这些被认为是协议的一部份：

 允许的消息序列，
 对通信任一参与者施加的限制，
 处理消息时将会发生的预期效果。

在语言如Haskell中的类型类被用来干协议所作的很多事情。

参见
 
 委托 (面向对象编程)
 Objective-C中的协议
 
 应用编程接口

引用

面向对象的程序设计