類目延展代理協議--複習篇

一.類目也稱爲分類
1.可以爲已知的類添加方法,哪怕是你沒有源碼的類
2.通過類目添加方法會稱爲原始類的一部分
3.與原類中的方法同級
4.而且會被子類繼承

類目的用處
1.可以擴展別人的類,可以座位子類的替代方式。
2.把同一個類的代碼放到多個文件中,便於多人協作
 

注意
1.不能在類目中添加 實例變量
2.可以爲同一類添加多個類目,蛋類目名和方法名不能城府
3.不能隨意重寫類的方法

下面我麼來看具體的代碼

類目.h文件
#import
//類目  在類目中不能添加實例變量
@interface NSString (CSayHi)
-(void)sayHi;//類目的方法

@end

類目.m文件
#import "NSString+CSayHi.h"

@implementation NSString (CSayHi)
-(void)sayHi{//類目方法的實現
   NSLog(@"這是類目提供的方法,字符內容是%@",self);
}
@end


main函數
#import
#import "NSString+CSayHi.h"
int main(int argc, const char * argv[])
{

   @autoreleasepool {
       NSString *str=@"hello";//定義一個字符串對象並賦值
       [str sayHi];//調用類目方法
       
       
       
    }
    return0;
}
二延展
1.延展是一種特殊形式的類目
2.延展中定義的方法在類本身中實現

作用
定義私有方法

注意

延展不寫類目名時,表示嚴重中定義的方法必須實現
如果提供了類目名稱,則可以選擇性實現

下面來看具體代碼
類的.m文件
#import "Student.h"
//延展寫在.m文件上
//延展不提供名稱表示方法必須實現,提供名稱可以不實現
//延展是定義私有方法
@interface Student(sayHi)
-(void)sayHi;//延展的聲明
@end

@implementation Student
@synthesize name;
-(void)sayHi{//延展的實現
   NSLog(@"%@打招呼",self.name);
}
-(void)say{
    [selfsayHi];
}
@end

main函數
       Student *stu=[[Student alloc]init];
       stu.name=@"小白";
       
       [stu say];//調用方法
三  協議
協議就是一套標準
協議只聲明瞭方法,不具體實現,接受協議的對象負責實現
oc的協議由@protocol聲明的一組方法列表
要求其他的類去實現,相當@interface部分的聲明
@protocol  協議名稱
@end

確認協議
定義的協議必須要被某些類實現
類中需要shiixan協議中定義的方法
此過程稱爲確認協議
@interface 類名:父親名<協議名稱,協議名二.....>
@end
注意
確認協議時應實現協議中@required修飾的方法
可以選擇性實現@opyional
使用[對象conformsToProtocol:@protocol(SalerProtocol)]判斷是否遵循協議
代理模式
即本身不做實際的事情,而要求其他人去做
@property(assign,nonatomic)id<協議名>delegate
看實際代碼 我們要求一個學生對服務員制定一個協議

學生類的.h文件

//首先我們創建一個學生的類
#import<Foundation/Foundation.h>

//學生的協議內容的聲明
@protocol roomServer <NSObject>

@required//必須要實現的
-(void)check;//結賬聲明
@optional//不是必須要實現的
-(void)tackClothes;//拿衣服
@end

@interface Student : NSObject
@property(assign,nonatomic)id<roomServer>delegate;//聲明屬性代理()該屬性遵守roomServer協議//
-(void)serve;//聲明方法
@end

學生類的.m文件
#import "Student.h"

@implementation Student
@synthesize delegate;
-(void)serve{
   //使用if委託給的對象是否遵守了協議
    if([self.delegate conformsToProtocol:@protocol(roomServer)]) {
       [self.delegate check];//服務員類的一個(代理)對象調用代理方法
       [self.delegate tackClothes];
    }
}
//制定一個服務員的類,需要服務員去遵守學生定的協議
服務員.h
#import<Foundation/Foundation.h>
#import "Student.h"
@interface Waiter : NSObject<roomServer>//把學生的協議引進

@end
服務員的.m文件
學生定的協議要由服務員來施行
#import "Waiter.h"

@implementation Waiter
-(void)check
{
   NSLog(@"我給您結賬");
}
-(void)tackClothes
{
   NSLog(@"我給您拿衣服");
}
@end


main文件
#import<Foundation/Foundation.h>
#import "Student.h"
#import "Waiter.h"
int main(int argc, const char * argv[])
{

   @autoreleasepool {
       
       Student *stu=[[Studentalloc]init];//給Student的stu對象開闢空間並賦初值      
       Waiter *wa=[[Waiter alloc]init];//非Waiter的wa對象開闢空間並賦初值
       stu.delegate=wa;//因爲要用stu對象的代理去執行學生對服務員協議的方法
       [stu serve];
    }
    return0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章