blog.csdn.net/tenfyguo/article/details/9220535
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];
- }