Protocol in Objective-C
Protocol 在 Objective-C 裡面,是定義列出一系列 method ,讓任何 class 想要接上這個 protocol 的 class 並且實作它們,但是 protocol 不能新增 instance variable。宣告時候想引用多個 protocol,寫法上是 < protocol1, protocol2 > 。
我們來看放在 UITableView.h 裡面的 UITableViewDataSource :
@protocol UITableViewDataSource
他可以在 method 清單裡面,規劃不同區域出來 @required 和 @optional,最後以 @end 作為結尾。顧名思義 required 的 method 在 implement 上都要實作,而在 optional 區域裡面,可實作可不實作。所以這樣在呼叫的這方,在呼叫到一個 optional 的 method 前,記得要加上判斷,不然在未判斷以前,呼叫執行進去,即會發生 exception。若要檢查物件是否有實作 protocol 定義,,用 conformsToProtocol 判斷,寫法如下:
它很像 Java 的 Interface,定義出 method,並且讓想要使用的 class 來 implement,但是開發上又不太一樣。Protocol 在 iOS 開發上,主要用於 Delegate。反觀 Java 的 Interface,單一個 Java implement class 可以 implement 多個 interface 檔案,但是都必須要去實作它們。無法像 Objective-C 這樣給與 optional 不強制一定要實作完成。
Protocol 可以拿來當一般的型別使用,例如:
id myBook;
這意思說 myBook 必須是要實作 Document 這個 protocol 的物件,才能接收進來。也讓 Compiler 可以事先做型別檢查。
另外這邊以另外一個例子:
@interface Document
意思是,Document 這個 class interface 加入了 Document protocol。然後今天我們要寫一個 Method 可以做到加入文件,如果說這個 method 最後要判定是否加入文件成功,我們也希望傳進來的是有加入 Document protocol 的,在寫法上可以加入這些判斷:
所以碰到傳進來是要 protocol,且要判定測試它是否有此 protocol,用 conformsToProtocol 判斷。
另外回來看 header 檔案的 interface,定義上算是這樣同樣命名的一組 (*.h, *.m ) 的介面,但是它裡面可以配製 variables,和定義 methods。 再由 implement class 來實作該 header 檔案。而在 extend 方面,都是交由 header 來處理,而 implement 檔案部份只要實作就好,規劃出物件導向設計。
以上如此看來 Objective-C 的 Protocol, Interface, Implement 和 Java 的 Interface, Implement 在設計開發上,即可瞭解雙方的不同。
我們來看放在 UITableView.h 裡面的 UITableViewDataSource :
@protocol UITableViewDataSource
他可以在 method 清單裡面,規劃不同區域出來 @required 和 @optional,最後以 @end 作為結尾。顧名思義 required 的 method 在 implement 上都要實作,而在 optional 區域裡面,可實作可不實作。所以這樣在呼叫的這方,在呼叫到一個 optional 的 method 前,記得要加上判斷,不然在未判斷以前,呼叫執行進去,即會發生 exception。若要檢查物件是否有實作 protocol 定義,,用 conformsToProtocol 判斷,寫法如下:
它很像 Java 的 Interface,定義出 method,並且讓想要使用的 class 來 implement,但是開發上又不太一樣。Protocol 在 iOS 開發上,主要用於 Delegate。反觀 Java 的 Interface,單一個 Java implement class 可以 implement 多個 interface 檔案,但是都必須要去實作它們。無法像 Objective-C 這樣給與 optional 不強制一定要實作完成。
Protocol 可以拿來當一般的型別使用,例如:
id
這意思說 myBook 必須是要實作 Document 這個 protocol 的物件,才能接收進來。也讓 Compiler 可以事先做型別檢查。
另外這邊以另外一個例子:
@interface Document
所以碰到傳進來是要 protocol,且要判定測試它是否有此 protocol,用 conformsToProtocol 判斷。
另外回來看 header 檔案的 interface,定義上算是這樣同樣命名的一組 (*.h, *.m ) 的介面,但是它裡面可以配製 variables,和定義 methods。 再由 implement class 來實作該 header 檔案。而在 extend 方面,都是交由 header 來處理,而 implement 檔案部份只要實作就好,規劃出物件導向設計。
以上如此看來 Objective-C 的 Protocol, Interface, Implement 和 Java 的 Interface, Implement 在設計開發上,即可瞭解雙方的不同。
Comments
Post a Comment