Posing,顾名思义,意思是“冒充”,它跟categories类似,但本质上不一样,Posing存在的目的在于子类可以冒充父类,使得后续的代码无需把父类修改为子类,就可以很方便的让父类表现成子类的行为,从而实现非常方便的冒充,这在一般的语言中是难以想象的。
它允许你扩展一个class,并且全面的冒充这个super class,比如:你有一个扩展NSArray的NSArrayChild对象,如果你让NSArrayChild冒充NSArray,则你程序代码所在的NSArray都会自动替换为NSArrayChild。注意,这里不是指代码替换,而是NSArray所在地方的行为都跟NSArrayChild一样了。
例子:
1,定义父类:
Fraction.m:
2,定义子类:
FractionChild.h:
FractionChild.m:
3, 开始用FractionChild 冒充Fraction
main.m:
它允许你扩展一个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];
}