Object-C中的協議Protocol
阿新 • • 發佈:2019-01-12
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
在寫java的時候都會有介面interface這個概念,介面就是一堆方法的宣告沒有實現,而在OC裡面,Interface是一個
類的標頭檔案的宣告,並不是真正意義上的介面的意思,在OC中,介面是由一個叫做協議的protocol來實現的。這個裡面
可以宣告一些方法,和java不同的是,它可以宣告一些必須實現的方法和選擇實現的方法。這個和java是完全不同的。
下面我們就用一個例子來說明這個吧。
首先是MyProtocol.h也就是介面的宣告檔案
//// MyProtocol.h// Protocol//// Created by bird on 12-10-22.// Copyright (c) 2012年 bird. All rights reserved.//#import <Foundation/Foundation.h>@protocol MyProtocol <NSObject>@optional//這個方法是可選的 - (void) print:(int) value;@required//這個方法是必須實現的- (int) printValue:(int) value1 andValue:(int) value2;@end
然後是Mytest.h也就是類的宣告檔案,這個類講實現這個介面
//// MyTest.h// Protocol//// Created by bird on 12-10-22.// Copyright (c) 2012年 bird. All rights reserved.//#import <Foundation/Foundation.h>#import "MyProtocol.h" @interface MyTest : NSObject <MyProtocol>- (void) showInfo;@end
下面就是實現檔案了
//// MyTest.m// Protocol//// Created by bird on 12-10-22.// Copyright (c) 2012年 bird. All rights reserved.//#import "MyTest.h"@implementation MyTest- (void) showInfo{ NSLog(@"show info is calling");}- (int) printValue:(int)value1 andValue:(int)value2{ NSLog(@"print info that value1 is %d and value2 is %d",value1,value2); return 0;}//下面的這個方法可以實現也可以不實現- (void) print:(int)value{ NSLog(@"print is value is %d",value);}@end
這樣我們就可以看出了,這個類實現了介面也就是協議的宣告的方法,然後還定義了自己的類方法。
下面我們來看一下主函式來使用這個介面,我將分別使用兩種方式來使用這個類,一個是基本的方法就是使用類的創
建來呼叫,另一個就是使用介面來呼叫
//// main.m// Protocol//// Created by bird on 12-10-18.// Copyright (c) 2012年 bird. All rights reserved.//#import <Foundation/Foundation.h>#import "MyTest.h"#import "MyProtocol.h"int main(int argc, const char * argv[]){ @autoreleasepool { //這裡是普通的類的呼叫方法 MyTest * myTest = [[MyTest alloc] init]; [myTest showInfo]; SEL sel = @selector(print:);//這個print轉換成的方法 //確定這個print方法是否實現 if([myTest respondsToSelector:sel]){ [myTest print:20]; } [myTest printValue:25 andValue:15]; [myTest release]; //下面的方法使用協議的方式來呼叫 id<MyProtocol> myProtocol = [[MyTest alloc] init]; if([myProtocol respondsToSelector:@selector(print:)]){ [myProtocol print:210]; } [myProtocol release]; } return 0;}
[myProtocol respondsToSelector:@selector(print:)]
這句話的用處就是測試是否這個類實現了這個方法