Posing,顧名思義,意思是“冒充”,它跟categories類似,但本質上不一樣,Posing存在的目的在於子類可以冒充父類,使得後續的代碼無需把父類修改為子類,就可以很方便的讓父類表現成子類的行為,從而實現非常方便的冒充,這在一般的語言中是難以想象的。
它允許你擴充一個class,並且全面的冒充這個super class,比如:你有一個擴充NSArray的NSArrayChild對象,如果你讓NSArrayChild冒充NSArray,則你程式碼所在的NSArray都會自動替換為NSArrayChild。注意,這裡不是指代碼替換,而是NSArray所在地方的行為都跟NSArrayChild一樣了。
例子:
1,定義父類:
Fraction.h:
#import <Foundation/NSObject.h>@interface Fraction : NSObject{ int numerator; int denominator;}-(id)initWithNumeration:(int)a:denominator:(int) b;-(void) print;@end
Fraction.m:
#import <stdio.h>#import "Fraction.h"@implementation Fraction-(id)initWithNumeration:(int)a:denominator:(int) b { self = [super init]; if(self) { numerator = a; denominator = b; } return self;}-(void) print { printf("Fraction: %i/%i", numerator, denominator);}@end
2,定義子類:
FractionChild.h:
#import "Fraction.h"@interface FractionChild : Fraction -(void) print;@end
FractionChild.m:
#import <stdio.h>#import "FractionChild.h"@implementation FractionChild-(void) print { printf("FractionChild: %i/%i", numerator, denominator);}@end
3, 開始用FractionChild 冒充Fraction
main.m:
#import <stdio.h>#import "Fraction.h"#import "FractionChild.h"int main(int agrc, const char * agrv[]) { Fraction *frac = [[Fraction alloc]initWithNumeration:3:denominator:4]; [frac print]; //此時輸出:Fraction: 3/4 //make FractionChild posing as Fracition,注意:poseAsClass這個方法是NSObject的一個內建方法,用於子類posing父類。 [FracitonChild poseAsClass [Fraction class]]; Fraction *frac2 = [[Fraction alloc]initWithNumeration:3:denominator:4]; [frac2 print]; //此時輸出:FractionChild: 3/4,此時的Fration表現行為便被FractionChild冒充了 [frac release]; [frac2 release];}