協議 (物件導向編程)
面向对象编程中的结构类型
概述
編輯協議指示著在調用者和對象之間的交互鏈,在其他方面都類同於通信協議。使用術語「協議」的語言包括: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{}
兼容於所有類型。
注意函數式編程和分布式編程語言使用術語協議類似於通信用法(比如允許消息交換的規定強調了交換而非消息)。特別是在這些語言中如下這些被認為是協議的一部份:
- 允許的消息序列,
- 對通信任一參與者施加的限制,
- 處理消息時將會發生的預期效果。
參見
編輯引用
編輯- ^ 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).