协议 (面向对象程序设计)

在面向对象程序设计中，两个无关的对象通过协议或者接口来进行相互通信。他们是一组方法和值的集合，这组集合便是不同的对象相互达成一致并用来协作的协议或接口。

举个例子，在Java语言中，有一个用来比较的接口 (Comparable) 具体规定了一个方法叫做compareTo()，需要实体类去实现。那么，这就意味着假使有一个独立的用于完成排序功能的方法想对一组实现了该接口的对象进行排序， 方法本身就无须知晓这个对象的内在属性，直接调用compareTo()方法便可对这些对象进行既定的排序工作。

协议是用来描述：

对象能够理解的消息，
这个消息可能传递的参数，
消息返回的类型，
对象状态变更时，得以保留的不变量，
将会需要客户对象处理的异常情况。

如果一个对象是封装良好的，协议很有可能提供了这个对象能够被访问的唯一途径。

一些编程语言直接支持协议或者接口 (Objective-C, Java, C#, D, Ada, Logtalk)，而早期的语言可能也有支持接口概念的特性，比如 C++中抽象基类里的纯虚函数，和 Perl里的面向对象特征。

请注意，在函数型程序设计和分布式程序设计语言中，也有一个概念叫做协议，但是这里协议的意思会有些许微妙的不同 (即一种允许消息交换的规格，其重点在于交换，而不是信息)。产生这个差异的原因是函数型程序设计和面向对象程序设计的范例有所不同。在这些语言中，以下几个方面也被认为是协议的一部分：

消息允许序列，
在通信中施加在任一参与者上的限制，
消息被处理所带来的预期效果。

物件導向的程序設計