协议 (面向对象编程)
协议(Protocol)是特定面向对象编程语言使用的术语,具有各种特殊含义,在其他语言中可能称为接口或trait。
概述
协议指示着在调用者和对象之间的交互链,在其他方面都类同于通信协议。使用术语“协议”的语言包括:Clojure、Elixir、Java 8、Logtalk、Objective-C[1]、Smalltalk-80、Swift、Python[2]。
在这些语言中,协议是离散的对象相互通信的常用方式。为了进行协作,将这些对象一致认可的方法和值的定义,作为API的一部份。协议/接口描述了:
- 对象所理解的消息。
- 这些消息可提供的实际参数。
- 这些消息返回的结果的类型。
- 不变量,即使对象状态被修改了而仍然保持。
- 异常情况,要求这个对象的客户处理。
- (只针对通信风格用途:)方法的调用序列和决定点,这些都会表示在UML交互图中:通信图、时序图、交互概述图/活动图、计时图。
如果对象是完全封装的,则协议将只描述对象能被其他对象访问的方式。例如Java中的接口,Comparable
接口指定了一个方法compareTo()
,实现类必须实现它。这意味着比如有一个独立的排序方法,可以排序实现了这个可比较接口的任何对象,而不用知道关于这个类的内部性质的任何事情(除了两个这种对象可以通过compareTo()
方式进行比较之外)。
一些编程语言提供对协议/接口的显式的语言支持:Ada、C#、D、Dart、Delphi、Go、Java、Logtalk、Object Pascal、Objective-C、PHP、Racket、Seed7、Swift。在C++中接口叫做抽象基础类,并被使用纯虚函数实现。Perl中的面向对象特征也支持接口。
非面向对象语言
尽管Go编程语言一般不被认为是面向对象语言,它允许在用户定义类型上定义方法。Go有“接口”类型,兼容于支持给定方法集合的任何类型(这个类型不需要显式的实现这个接口)。空接口interface{}
兼容于所有类型。
注意函数式编程和分布式编程语言使用术语协议类似于通信用法(比如允许消息交换的规定强调了交换而非消息)。特别是在这些语言中如下这些被认为是协议的一部份:
- 允许的消息序列,
- 对通信任一参与者施加的限制,
- 处理消息时将会发生的预期效果。
在语言如Haskell中的类型类被用来干协议所作的很多事情。
参见
引用
- ^ The Objective-C programming Language:Protocols. Apple Inc. [7 October 2012]. (原始内容存档于2016-04-16).
- ^ Official Python 3 Documentation, Abstract Object Layer. [2021-03-28]. (原始内容存档于2021-05-18).