协议 (面向对象编程)

面向对象编程中的结构类型

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

概述

协议指示着在调用者和对象之间的交互链,在其他方面都类同于通信协议。使用术语“协议”的语言包括:ClojureElixirJava 8Logtalk英语LogtalkObjective-C[1]Smalltalk-80SwiftPython[2]

在这些语言中,协议是离散的对象相互通信的常用方式。为了进行协作,将这些对象一致认可的方法和值的定义,作为API的一部份。协议/接口描述了:

  1. 对象所理解的消息。
  2. 这些消息可提供的实际参数。
  3. 这些消息返回的结果的类型。
  4. 不变量英语Class invariant,即使对象状态被修改了而仍然保持。
  5. 异常情况,要求这个对象的客户处理。
  6. (只针对通信风格用途:)方法的调用序列和决定点,这些都会表示在UML交互图中:通信图英语Communication diagram时序图交互概述图/活动图计时图

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

一些编程语言提供对协议/接口的显式的语言支持:AdaC#DDartDelphiGoJavaLogtalk英语LogtalkObject PascalObjective-CPHPRacketSeed7英语Seed7Swift。在C++中接口叫做抽象基础类,并被使用纯虚函数实现。Perl中的面向对象特征也支持接口。

非面向对象语言

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

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

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

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

参见

引用

  1. ^ The Objective-C programming Language:Protocols. Apple Inc. [7 October 2012]. (原始内容存档于2016-04-16). 
  2. ^ Official Python 3 Documentation, Abstract Object Layer. [2021-03-28]. (原始内容存档于2021-05-18).