天天看點

Object—C程式設計詳解(四)-協定(protocol)

協定

協定的功能類似于c++中對抽象基類的多重繼承。協定是多個類共享方法的清單。協定中列出的方法在本類中并沒有相應的實作,而是由别的類來實作這些方法。如果一個類要遵守一個協定,該類就必須實作特定協定的所有方法(可選方法除外)。

非正式協定

非正式協定是NSObject類(顯而易見,還包括它的子類)的類别,其所有的子類都含蓄地接受了這個協定。(類别是Objective-C的一個語言特點,可以讓你在無需子類化的前提下為一個類增加方法。)非正式協定中的方法是否實作都是可選的,是以在調用非正式協定中的方法之前,需要去檢查對象類是否實作了它。在Objective-C2.0中引入可選的正式協定方法之前,非正式協定是Foundation和AppKit類實作委托的唯一方式。

類别(catgory)可以實作非正式協定,這種以NSObject類為基礎,為NSObject建立類别,建立類别時即可指定該類别應該新增的方法。當某個類實作NSObject的該類别時,就需要實作該類别下的所有方法,這種基于NSObject定義的類别即可認為是非正式協定。

正式協定

定義一個協定需要使用@protocol指令,緊跟着是協定名稱,然後是聲明的一些方法,在指令@end之前的所有方法的聲明都是協定的一部分。

@protocol 協定名 <父協定1,父協定2>
{
         零到多個方法定義....
}
           

說明:

1.協定名應與類名采用相同的命名規則。即如果僅從文法角度來看,協定名隻要是合法的标示符即可。

2.一個協定可以有多個直接父協定,但協定隻能是繼承協定,不能繼承類。

3.協定中定義的方法隻有方法簽名,沒有方法實作;協定中包含的方法即可是類方法,也可是執行個體方法。

4.協定定義的是多個類共同的公告行為規範,是以,協定裡所有的方法都是公開的通路權限。

非正式協定與正式協定的差別

1.非正式協定通過為NSObject建立類别來實作,而正是協定則直接使用@protocol建立。

2.遵守非正式協定通過繼承帶特定類别的NSObject來實作;而遵守正式協定則有專門的文法。

3.遵守非正式協定不要求實作協定中定義的所有方法;而遵守正式協定則必須實作協定中定義的所有方法。

為了彌補遵守正式協定必須實作協定的所有方法造成靈活性不足,Object-C2.0新增@optional、@required。

①@required

該類的方法在遵守相應協定的類中是必須被實作的,不然編譯器會告警(顯然這是在編譯時做的檢查,而不是在運作時)

②@optional

該類的方法在遵守相應協定的類中是否實作是可選的

協定與委托(delegate)

協定展現的是一種規範,定義協定的類可以把協定定義的方法委托給實作協定的類,這樣可以讓類定義具有更好的通用性質,因為具體的動作交給協定的實作類去完成。無論是基于Mac的Cocoa應用開發,還是ios應用開發,各種應用程式大量依賴委托。