協議 (物件導向編程)

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

協議(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).