objective-c中提供了可以讓我們擴充套件類定義的手段:類目,延展和協議。
類目:為已知的類(已知的類包括自己定義的類和系統提供的類)增加新的方法;
延展:在自己類的實現中(.m檔案中)新增類目來宣告私有的方法
協議:協議宣告了可以被任何類實現的方法。
注意:這些手段只能增加類的方法,並不能用於增加例項變數,要增加類的例項變數,只能通過定義子類來間接實現。
協議的真正作用就是傳值
**:讓兩個沒有關係的類產生關係
類目
(也叫分類)
通過兩部分**來向原始類新增方法
1、以乙個類目名的名義在介面中宣告一些方法;
2、同樣以類目名的名義在實現檔案中定義這些方法的實現:
類目的好處
1、通過類目新增的方法會成為原始類的一部分;
2、通過類目新增的方法和原始類中的方法在使用起來沒有任何等級差別;
3、類目裡面定義的方法會被原始類的子類所繼承;
4、使用類目最大的好處是能擴充套件被人的實現的類,而且不需要獲得原始類的源**;
類目的侷限性
1)無法向類中新增新的例項變數,類目沒有位置容納例項變數
2)名稱衝突,當類目中的方法和原始類方法名稱衝突使,類別具有更高的優先順序,類目方法將完全取代初始方法二無法再使用初始方法
類目的用處
可以擴充套件別人的類
把**放到多個檔案中;便於多人協作
延展
1)延展使另外一種類目,只不過是將類目寫在了類的實現檔案中(.m);
2)延展中定義的方法值在implementation**區中實現;(簡而言之,延展就是只將方法寫在.m中,這樣就變成了私有的方法)
延展說明
1)當定義延展時,如果不提供類目名,那麼延展中定義的方法使必須要被實現的,如果缺少實現** 那麼編譯器將會報錯。
也就是
// 定義延展
@inte***ce
host
()//未提供類目名,-(int)count方法是一定要被實現的
-(int)count;
@end
2)如果指定了類目名,則延展中的方法可以不實現
@inte***ce
host
(sayhi)//提供了類目名,-(int)count方法可以不實現
-(int)count;
@end
延展例項**:(注意延展是寫在.m中的)
// 定義延展
@inte***ce
host()
-(int)count;
@end
// 延展中方法的實現
-(int)count
協議
協議裡面定義了一堆的方法,這些方法未和任何類未發生關聯,它只定義了方法,但不關心具體怎麼去實現這些方法。協議就像乙個條款,一旦某個物件遵守了協議,那麼這個物件就要去實現協議裡面的相關方法。
定義協議(假設定義了乙個房屋出租協議)
//協議只定義在.h檔案,它沒有.m檔案
#import
@protocol houserentprotocol //定義乙個房屋出租的協議
// 必須要實現的協議 用required修飾
@required
-(void)renthouse:(id)ahost money:(int)amoney;
// 可選實現的協議 用optional修飾
@optional
-(void)transwater;
@end
確認協議(假設建立了中介所,這個中介確認了已經定義好的房屋出租協議),所謂確認協議就是實現協議中必須實現的協議(也就是必須實現的方法)
在agent.h檔案中
#import
#import "houserentprotocol.h" //匯入協議
// 確認協議 ,注意確認協議的書寫格式
@inte***ce
agent :
nsobject
//中介確認房屋出租協議
@end
//這個中介有它的方法(假設中介要做的事情是把房東的房子出租給房客)
//在agent.m中
#import "agent.h"
@implementationagent
-(void)renthouse:(id)ahost money:(int)amoney //renhouse是必須實現的協議中介把房子出租給房客
@end
//假設有乙個房東,她要出租房子,因此她要找到中介
//在host.h中
#import
#import "houserentprotocol.h"
@inte***cehost :
nsobject
@property(nonatomic,assign)iddelegate;
@property(nonatomic,retain)
nsstring
*name;
-(id)initwithname:(nsstring *)aname;
-(void)renthouse;//房東出租房子
@end
//在host.m檔案中
#import "host.h"
#import "host_private.h"
#import "houserentprotocol.h"
@implementationhost
@synthesizename =
_name;
@synthesize delegate = _delegate; //房東找的中介**
-(id)initwithname:(nsstring *)aname
returnself; }
-(void)dealloc
-(void)renthouse//房東要把房子租出去}
agent *agent = [[agent
alloc] init]; //中介初始化乙個例項
host *h = [[host
alloc] initwithname:@"
包租婆"]; //房東初始化乙個例項
// 設定
**人
h.delegate = agent; //房東設定乙個**
[h renthouse]; //房東出租房屋,
房東註冊的delegate是聯絡中介和房東直接的橋梁,它將兩個沒有關係的類聯絡到了一起,實現了類之間的傳值,這也就是所謂的**模式。
乙個類實現了協議中宣告的方法稱為確認了該協議,協議需要被其他類所確認,否則這個協議就沒有意義了。
協議的特點:
1)可以規範類的行為;
2)利於系統設計
3)利於團隊開發等
4)是可選語法,並不是一定要使用協議
用協議**傳值
OC 類的擴充套件
類的擴充套件 繼承 類目延展 協議 1.類目 category 命名 inte ce 要擴充套件的類名 類目名 end 特點 1.不可定義成員變數,而且一般不定義屬性 2.可以新增方法,可重寫原始類的方法,原始類的物件呼叫 2.延展 extension 命名 寫在.m檔案裡 inte ce 類名 e...
C 類的擴充套件
擴充套件方法使你能夠向現有型別 新增 方法 oc的類目與此相似 而無需建立新的派生型別 重新編譯或以其他方式修改原始型別。擴充套件方法是一種特殊的靜態方法,但可以像擴充套件型別上的例項方法一樣進行呼叫。擴充套件方法被定義為靜態方法,但它們是通過例項方法語法進行呼叫的。它們的第乙個引數指定該方法作用於...
OC 類的擴充套件
girl.h protocol marry 協議的內容 方法宣告 required是必須實現的方法,預設必須實現 optional是可選擇執行的方法 required void makemoney optional void cook 2.設定 人屬性 property nonatomic,assi...