Object-C篇-設計模式之協議
一 : 簡述
在Java中也有與協議相似的概念,稱為介面
-interface,是常量與抽象方法的集合.但是在OC中協議-protocol
,協議就是是一方法的宣告,這些方法可以有選擇實現與必須要實現的.
二 : 協議的定義
@protocol 協議名稱 // 方法宣告列表 @end
示例
建立了一個協議,其中有一個必須實現的方法study
@protocol StudyProtocol <NSObject> - (void)study; @end
三 : 遵守協議
有了協議,那麼如何使用這個協議呢.
讓類遵守協議
@interface 類名 : 父類 <協議名稱1, 協議名稱2,…> @end
OC是單繼承
,但是一個類可以遵守一個或多個協議
@interface Person : NSObject<EatProtocol, StudyProtocol> @end
@implementation Student // 實現協議方法 - (void)EatSomting { NSLog(@"%s", __func__); } // 實現協議方法 - (void)study { NSLog(@"%s", __func__); }
協議和繼承的區別
- 繼承之後預設就有實現, 而protocol只有宣告沒有實現
- 相同型別的類可以使用繼承, 但是不同型別的類只能使用protocol
- protocol可以用於儲存方法的宣告, 可以將多個類中共同的方法抽取出來, 以後讓這些類遵守協議即可
四 : 協議的使用特點
-
父類遵守了某個協議,那麼子類也自動遵守此協議
父類遵守了此協議
@interface Person : NSObject< StudyProtocol> @end
子類自然遵守此協議
@interface Student : Person @end
@implementation Sutdent -(void)study{ }
-
協議可以遵守協議
一個協議遵守了另一個協議,就可以擁有另一份協議中的方法宣告
@protocol A -(void)methodA; @end @protocol B <A> -(void)methodB; @end
@interface TZperson : NSObject <B> -(void)methodA; // 同時擁有A/B協議中的方法宣告 -(void)methodB; @end
-
基協議
每個協議都應該遵守NSObject
協議,它是一個基協議,最根本的協議.
@protocol A<NSObject> // 基協議 -(void)methodA; @end
-
required 與 optional關鍵字
required
: 方法必須要實現,不實現則編譯器會發出警告
optional
: 方法不一定要實現
用於開發者之間的交流
如果沒有使用任何關鍵字修飾協議中的方法,那麼該方法預設就是required
的,關鍵字並不能嚴格的控制某一個遵守該協議的類必須要實現該方法, 因為即便不是實現也不會報錯, 只會報一個警告
@protocol A @required -(void)methodA; @optional -(void)methodA; @end
五 : 型別限定
定義協議
@protocol girlGod @required -(void)beatuiful; @optional -(void)sexy; @end
要求某些物件具備上述協議行為,可以將協議寫在資料型別的右邊,明確的標註如果想給該變數賦值,那麼該物件必須遵守某個協議
id<girlGod> girl = [girl new];
格式 : 資料型別<協議名稱> 變數名,和泛型是一個寫法
六 : respondsToSelector
當某個類遵守了某個協議,但並意味著,它就一定要實現它,因為不實現也不報錯.當這個類被例項化,意味著可以呼叫其遵守的協議方法,但如果沒有實現就會報錯,所以要使用respondsToSelector
進行判斷是否實現了某些協議方法
@protocol wiftPro <NSObject> -(void)dohouseWork; -(void)papapa; @end
@interface wife : NSObject<wiftPro>
if ([self.wift respondsToSelector:@selector(dohouseWork)]) { [self.wift papapa]; }