OC之非正式協議總結

前言:

在OC中非正式協議用的不多。

1.Demo解釋:

寫了一個demo,就是老闆要出差去上海,於是就會派遣員工去張羅着件事,買機票,買水和食物,還要處理走之前公司的事情。老闆如果自己做,這些代碼就要實現在自己的代碼裏面,但是如果把這些方法聲明在協議裏面,就減少了代碼的耦合度,任何人都可以做這些事情,老闆只需要指定某個實現該協議的人去做就ok了,隨時可以裁員,換人。我們可以使用正式協議也可以使用非正式協議,這裏我先寫一個非正式協議的demo.

2.Demo結構及代碼:

OC-非正式協議demo

main.m
#import <Foundation/Foundation.h>
#import "Boss.h"
#import "Employee1.h"
#import "Employee2.h"
#import "Employee3.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Boss *boss=[[Boss alloc] init];
        Employee1 *e1=[[Employee1 alloc] init];
        Employee2 *e2=[[Employee2 alloc] init];
        Employee3 *e3=[[Employee3 alloc] init];
        boss.delegate=e1;
        [boss buyTickets];//讓員工1去買機票
        boss.delegate=e2;
        [boss buyWaterAndFoods];//讓員工2去買食物和水
        boss.delegate=e3;
        [boss dealWithThings];//讓員工3去處理老闆走之前的事情

    }
    return 0;
}
Extension
NSObject_Prepare.h
//《Prepare協議》
// 注意1:非正式協議只用來擴展NSObject類,通常所說的OC中的擴展就是非正式協議
// 注意2:非正式協議中聲明的方法是可選實現的,可以只實現一部分
// 注意3:非正式協議使用委託的時候只需要將委託的類型聲明成id類型就可以了,不用聲明具體遵守哪一個協議
// 委託對象的類.h文件中只需要導入協議文件,然後在自己的.m文件中實現需要實現的方法就可以了,不用再次聲明瞭
#import <Foundation/Foundation.h>

@interface NSObject ()
//在Employee1中只實現了前兩個方法,第三個方法沒有實現
-(void)buyTickets;
-(void)buyWaterAndFoods;
-(void)culPrices;
@end
NSObject_Deal.h
//《Deal協議》
#import <Foundation/Foundation.h>

@interface NSObject ()
-(void)dealWithThings;//處理事情的方法
@end
Interface
Boss.h
#import <Foundation/Foundation.h>
#import "NSObject_Prepare.h"//導入協議
#import "NSObject_Deal.h"//導入協議
@interface Boss : NSObject
@property(nonatomic,assign)id delegate;//非正式協議委託人
-(void)gotoShangHai;
@end
Boss.m
#import "Boss.h"
@implementation Boss
-(void)gotoShangHai{
    NSLog(@"我要去上海開會");
}
#pragma mark - NSObject_Prepare協議
-(void)buyTickets{
//    NSLog(@"我自己買了往返機票");//原來需要自己去做的事情,接下來要交給委託人去做
    if ([_delegate respondsToSelector:@selector(buyTickets)]) {
        [_delegate buyTickets];//調用委託對象的買票方法
    }
}
-(void)buyWaterAndFoods{
//    NSLog(@"我自己買了水和食物");//原來需要自己去做的事情,接下來要交給委託人去做
    if ([_delegate respondsToSelector:@selector(buyWaterAndFoods)]) {
        [_delegate buyWaterAndFoods];//調用委託對象的買票方法
    }
}
#pragma mark - NSObject_Deal協議
-(void)dealWithThings{
//    NSLog(@"我得在走之前把要處理的事情都處理好");//原來需要自己去做的事情,接下來要交給委託人去做
    if ([_delegate respondsToSelector:@selector(dealWithThings)]) {
        [_delegate dealWithThings];//調用委託對象的處理事情方法
    }
}
@end
Employee1.h
#import <Foundation/Foundation.h>
#import "NSObject_Prepare.h"//步驟1
@interface Employee1 : NSObject
@end
Employee1.m
#import "Employee1.h"
@implementation Employee1
//步驟2 只要在這裏實現buyTickets方法就可以
-(void)buyTickets{
    NSLog(@"我是員工1,我負責買往返機票");
}
@end
Employee2.h
#import <Foundation/Foundation.h>
#import "NSObject_Prepare.h"//步驟1 導入協議
@interface Employee2 : NSObject
@end
Employee2.m
#import "Employee2.h"
@implementation Employee2
//步驟2 實現協議中的方法
-(void)buyWaterAndFoods{
    NSLog(@"我是員工2,我負責買食物和水");
}
@end
Employee3.h
#import <Foundation/Foundation.h>
#import "NSObject_Deal.h"//步驟1 導入協議
@interface Employee3 : NSObject
@end
Employee3.m
#import "Employee3.h"
@implementation Employee3
//步驟2 實現方法
-(void)dealWithThings{
    NSLog(@"我是員工3,我負責處理老闆走之前的事情");
}
@end

3.Demo運行結果:

這裏寫圖片描述

總結:

非正式協議用的不多,因爲如果是對類的擴充的話,可以使用類別category,雖然這樣只能擴充方法不能擴充屬性;如果是單純把方法獨立出來實現,完成多繼承的功能,可以使用正式協議。
下一篇是OC中的正式協議。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章