協議 (物件導向程序設計)

維基百科,自由的百科全書

物件導向程序設計中,兩個無關的對象通過協議或者接口來進行相互通信。他們是一組方法和值的集合,這組集合便是不同的對象相互達成一致並用來協作的協議或接口。

舉個例子,在Java語言中,有一個用來比較的接口 (Comparable) 具體規定了一個方法叫做compareTo(),需要實體類去實現。那麼,這就意味著假使有一個獨立的用於完成排序功能的方法想對一組實現了該接口的對象進行排序, 方法本身就無須知曉這個對象的內在屬性,直接調用compareTo()方法便可對這些對象進行既定的排序工作。

協議是用來描述:

  1. 對象能夠理解的消息,
  2. 這個消息可能傳遞的參數,
  3. 消息返回的類型,
  4. 對象狀態變更時,得以保留的不變量,
  5. 將會需要客戶對象處理的異常情況。

如果一個對象是封裝良好的,協議很有可能提供了這個對象能夠被訪問的唯一途徑。

一些程式語言直接支持協議或者接口 (Objective-C, Java, C#, D, Ada, Logtalk),而早期的語言可能也有支持接口概念的特性,比如 C++中抽象基類里的純虛函數,和 Perl里的物件導向特徵。

請注意,在函數型程序設計分布式程序設計語言中,也有一個概念叫做協議,但是這裡協議的意思會有些許微妙的不同 (即一種允許消息交換的規格,其重點在於交換,而不是信息)。產生這個差異的原因是函數型程序設計和物件導向程序設計的範例有所不同。在這些語言中,以下幾個方面也被認為是協議的一部分:

  1. 消息允許序列,
  2. 在通信中施加在任一參與者上的限制,
  3. 消息被處理所帶來的預期效果。