Protocol in Objective-C
来源:互联网 发布:wpf 数据绑定 编辑:程序博客网 时间:2024/05/23 00:06
前面提到了OOP的繼承,但不像C++可以有多重繼承,Objective-C是單一繼承的,如果想要做到一個類別同時擁有多種型別的能力,可以透過實作其它型別的interface來達成這個目的。在Java/AS3是用”interface”這個關鍵字,在Objective-C則是用”@protocol”。(有寫過Java/AS3的要特別注意不要把interface跟protocol搞混了,在Objective-C的interface等於Java/AS3的class,而protocol則是相當於interface)
直接來看看要怎麼做吧。如果你要新增一個自定的protocol的話,可以直接在你的專案裡新增一個protocol檔:
當然,你要全部寫在一起也沒人反對,只是為了模組化以及以後的可重複使用考量,建議獨立出來另外寫。新增完成之後(它是一個header檔),就可以開始來寫了,程式碼如下:
在Objective-C裡的protocol是用@protocol
這個語法來定義的。在上面這段程式碼裡,我放了兩個方法,但沒有寫內容。接下來如果我要實作自這個protocol的話,所有定義在@protocol裡的方法都得實作出來。另外,在Objective-C 2.0之後加了@required
跟@optional
的語法,可以讓你設定這個method是不是必需一定要實作的項目。用法如下:
如果沒特別標明的,預設是@required。如果你要實作這個protocol的話,照英文字面來看,@required的部份是規定要實作的,@optional的話就隨你高興了。要注意的是@required跟@optional這兩個語法的影響範圍,是從它以下所有的method都會被影響,直到另一個directive或是@end為止,所以如果你要省略@required的話,記得那些method要寫在@optional前面。接下來來看看要怎麼實作這個protocol:
實作protocol的方法就是用”<>”標記,裡面放protocol的名稱。並不限定只能實作一個protocol,如果要實作多個protocol的話,則是用逗點分開:
因為到目前為止,我們都還沒實作那個protocol裡定義的方法,所以這時候如果直接按下Build的話,就會跳出警告訊息:
接著來把該做的填一填吧。因為在protocol的地方已經有定義好了方法,所以在@interface的地方就不用再特別寫一次,只要在@implementation裡補上該實作的方法就行了。
如果你實作了所有@required的方法的話,則稱為遵守(conform)或採納(adopt)這個protocol(硬翻成中文還是覺得怪怪的,還是英文比較簡潔直接)。若要檢查某物件是否有乖乖遵守某個protocol的規定:
protocol本身也可以像一般類別的繼承,例如:
這時如果你要實作protocol B,則methodA跟methodB都需要實作。
另外,你也可以把protocol拿來當一般的型別定義來用,例如:
表示說這個some_object是個有實作Drawable這個protocol的物件,在編譯階段就可以先做型別檢查。當然也可以一次多個,一樣用逗點分開:
上面提到的這種用@protocol來定義方法的,稱做formal protocol
,從名字看大概猜得出來一定也有叫做informal protocol
的東西,不過這個會在category的部份再做說明。
转自:http://blog.eddie.com.tw/2010/12/11/protocol-in-objective-c/
- Protocol in Objective-C
- Protocol in Objective-C
- Protocol in Objective-C
- objective-c protocol
- Objective-c 协议(protocol)
- Objective C 协议(Protocol)
- Objective-c中的 Protocol
- Objective-c中的protocol
- Objective-C中的Protocol
- Objective-C Protocol
- objective-c中protocol
- [Objective-C] Protocol 简介
- objective-c @protocol
- Objective-C中的Protocol
- Objective-C 协议 protocol
- 26.Difference between protocol in objective c and interfaces in java?
- Objective-C中的协议Protocol
- Objective-C 协议(protocol)
- viewpager动态加载数据
- ogre shadow(阴影)函数笔记
- 第一个Unity项目Hello Unity
- BZOJ4154——IPSC2015 Generating Synergy
- VS2010出现fatal error C1902: 程序数据库管理器不匹配;请检查安装
- Protocol in Objective-C
- jquery 的(function(){});表示什么
- IOS中的ViewController 的loadView、viewDidLoad、viewDidUnload
- idea快捷键
- bootstrap js插件篇——下拉菜单、滚动监测、选项卡
- asp.net mvc4 简单使用Autofac依赖注入小结
- phonegap(cordova) 入门 9----小知识点总结--iOS 状态栏的字体颜色都设置为白色
- UVA 658 - It's not a Bug, it's a Feature!(dijkstra+优先队列)
- 第一天 环境变量的配置