热门问题
时间线
聊天
视角
協定 (物件導向程式設計)
面向对象编程中的结构类型 来自维基百科,自由的百科全书
Remove ads
協定(英語: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中的物件導向特徵也支援介面。
Remove ads
非物件導向語言
儘管Go程式語言一般不被認為是物件導向語言,它允許在使用者定義類型上定義方法。Go有「介面」類型,相容於支援給定方法集合的任何類型(這個類型不需要顯式的實現這個介面)。空介面interface{}
相容於所有類型。
注意函數式程式設計和分散式編程語言使用術語協定類似於通訊用法(比如允許訊息交換的規定強調了交換而非訊息)。特別是在這些語言中如下這些被認為是協定的一部份:
- 允許的訊息序列,
- 對通訊任一參與者施加的限制,
- 處理訊息時將會發生的預期效果。
參見
- 概念 (泛型編程)
- 委託 (物件導向程式設計)
- Objective-C中的協定
- 公開介面
- 應用編程介面
參照
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads