有關於iOS底下的Protocol
請參照至其版大的文章
Protocol in Objective-C
http://blog.eddie.com.tw/2010/12/11/protocol-in-objective-c/
這版大實在寫的思路很清晰,推薦一下摟
(看來我還是要多多拜讀別人的文章才是)
------------------------------------------------------------------------------------------------
為了響應不全文引用,以下採用節錄的,完整內容請移至版大的文章
Objective-C是單一繼承的,如果想要做到一個類別同時擁有多種型別的能力,可以透過實作其它型別的interface來達成這個目的。在Java/AS3是用”interface”這個關鍵字,在Objective-C則是用”@protocol”。
(有寫過Java/AS3的要特別注意不要把interface跟protocol搞混了
,在Objective-C的interface等於Java/AS3的class,而protocol則是相當於interface)
Johnny: 關於protocol這點,我也常常搞混.....= =||
如果你要新增一個自定的protocol的話,可以直接在你的專案裡新增一個protocol檔:
新增完成之後(它是一個header檔),就可以開始來寫了,
---------------------------------------------------------------------------------------------------
程式碼如下:
@protocol Drawable
@required
-(void) draw;
-(void) changeColor;
@optional
-(void) whateverMethod;
@end
在上面這段程式碼裡,我放了三個方法,但沒有寫內容。接下來如果我要實作自這個protocol的話,所有定義在@protocol裡的方法都得實作出來。
如果沒特別標明的,預設是@required。如果你要實作這個protocol的話,照英文字面來看,@required的部份是規定要實作的,@optional的話就隨你高興了。要注意的是@required跟@optional這兩個語法的影響範圍,是從它以下所有的method都會被影響,直到另一個directive或是@end為止
-------------------------------------------------------------------------------------------------------------------------
實作protocol的方法就是用”<>”標記,裡面放protocol的名稱。並不限定只能實作一個protocol,如果要實作多個protocol的話,則是用逗點分開
因為在protocol的地方已經有定義好了方法,所以在@interface的地方就不用再特別寫一次,只要在@implementation裡補上該實作的方法就行了。
// --------------
// interface
// --------------
#import <Cocoa/Cocoa.h>
#import "Drawable.h"
@interface Book : NSObject <Drawable>
{
int price;
}
@property int price;
@end
// --------------
// implementation
// --------------
#import "Book.h"
@implementation Book
@synthesize price;
// 實作方法draw
-(void) draw
{
NSLog(@"draw me!");
}
// 實作方法changeColor
-(void) changeColor
{
NSLog(@"change color!");
}
@end
-------------------------------------------------------------------------------------------------------------------------
Johnny: 簡單來講,protocol就是Java裡的介面(Interface),上面開出來的方法(method)
且有@required字樣的都要被實作(implementation)
protocol名稱加綴在類別(class)後面
只是為了要讓Complier,確實的去檢查,開出來的方法
是有都通通有實作完畢
實驗發現,某些Class對於protocol要求沒那麼嚴苛
只要實作出它要的方法,而不用加掛這個綴字
而且避免混淆,我現在習慣通通都加上去
(包含放在Class名稱之後的 < > ,和其protocol要的方法一起宣告在header檔)
我還是覺得還是要學Java一樣,嚴謹一點比較好,較不會出錯
留言列表