Objective-C中范疇與類擴展

關(guān)于范疇

實現(xiàn)某個類的一部分方法的模塊叫做范疇或者類別。一個類既可以不適用任何范疇,也可以由多個范疇構(gòu)成。
范疇和類一樣,都是在接口文件中聲明,在類文件中實現(xiàn)。但是范疇中不能聲明實例變量,只能聲明方法,聲明的方法既可以是類方法也可以是實例方法。
在一個類中如果有很多方法,把所有實現(xiàn)部分都寫在一個文件里比較不方便,這種情況下,可以通過范疇類將類的實現(xiàn)部分以模塊為單位分散到多個不同的文件中,也就是把范疇作為類的子模塊來使用。
范疇的語法
類名部分為范疇所屬的類的名字或即將添加該范疇的類的名字。類名必須是已經(jīng)存在的類,不能為一個不存在的類定義范疇。
==范疇的聲明:==
@interface 類名(范疇名)
方法的聲明;
。。。
@end
==范疇的定義:==
@implementation 類名(范疇名)
方法的定義;
。。。
@end
范疇的接口部分需要遵循以下幾個原則:

  • 范疇的接口部分必須引用主文件的接口部分
  • 范疇的實現(xiàn)部分必須引用對應(yīng)的接口文件
  • 使用范疇中的方法時必須引用這個方法所在的頭文件
    除了要調(diào)用范疇部分中定義的方法之外,主文件接口部分中不會引用各個范疇的接口文件和實現(xiàn)文件。范疇的接口部分可以聲明在包含主文件接口的頭文件中,也可以為每個范疇部分單獨定義一個頭文件。每個實現(xiàn)文件都可以被單獨編譯。實現(xiàn)文件一般命名為“類名+范疇名.m”。
    以下代碼為上述兩種方式的示例:
    ==只有一個接口文件時范疇定義示例==
頭文件Card.h
#import <Foundation/NSObject.h>
@interface  Card : NSObject
{
...
}
-(void)methodA;
-(void)methodB;
@end

@interface Card (Display)
-(void)methodP;
@end

@interface Card (Sort)
-(void)methodX;
-(void)metodY;
@end

文件Card.m

@implementation Card
- (void)methodA {...}
- (void)methodB {...}
@end

文件Card+Display.m

#import "Card.h"
@implementation Card (Display)
- (void)methodP {...}
@end

文件Card+Sort.m

@implementation Card (Sort)
- (void)methodX {...}
- (void)methodY {...}
@end

單獨定義頭文件時的范疇定義示例

 Card.h
 #import <Foundation/NSObject.h>
 @interface Card : NSObject
 {
 ...
 }
 - (void)methodA;
 - (void)methodB;
 @end

頭文件Card+Display.h

#import "Card.h"
@interface Card (Display)
- (void)methodP;
@end

頭文件Card+Sort.h

#import "Card.h"
@interface Card (Sort)
- (void)methodX;
- (void)methodY;
@end

文件Card.m

#import "Card.h"
@implementation Card
- (void)methodA {...}
- (void)methodB {...}
@end

文件Card+Display.m

#import "Card+Display.h"
@implementation Card (Display)
- (void)methodP {...}
@end

文件Card+Sort.m

#import "Card+Sort.h"
@implementation Card (Sort)
- (void)methodX {...}
- (void)methodY {...}
@end

關(guān)于類擴展

把類分為多個范疇來實現(xiàn)的情況下,主類和各個范疇都是獨立的,每個范疇都不清楚其他的部分,有的范疇可能是執(zhí)行前加載的,有的范疇可能是執(zhí)行時動態(tài)加載的。
這種實現(xiàn)方法的可擴展性非常好,但編譯器在連接時不會檢查是否所有的范疇都被鏈接到了可執(zhí)行文件中。
為此,類擴展被引入進來。類擴展的聲明和范疇相似,只是圓括號之間沒有文本。如下

@interface Card ()
- (BOOL)hasSameSuit:(Card *)obj;
@end

==但是與范疇不同的是,使用類擴展可以增加實例變量如下:==

@interface Card () {
BOOL flag;
}
- (BOOL)hasSameSuit:(Card *)obj;
@end

類擴展中聲明的方法需要在類的實現(xiàn)文件中實現(xiàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容