objective-c posing

blog.csdn.net/tenfyguo/article/details/9220535

Posing,顾名思义,意思是“冒充”,它跟categories类似,但本质上不一样,Posing存在的目的在于子类可以冒充父类,使得后续的代码无需把父类修改为子类,就可以很方便的让父类表现成子类的行为,从而实现非常方便的冒充,这在一般的语言中是难以想象的。

       它允许你扩展一个class,并且全面的冒充这个super class,比如:你有一个扩展NSArray的NSArrayChild对象,如果你让NSArrayChild冒充NSArray,则你程序代码所在的NSArray都会自动替换为NSArrayChild。注意,这里不是指代码替换,而是NSArray所在地方的行为都跟NSArrayChild一样了。
       例子:
1,定义父类:

Fraction.h:

[cpp]  view plain copy
  1. #import <Foundation/NSObject.h>  
  2.   
  3. @interface Fraction : NSObject{  
  4.    int numerator;  
  5.    int denominator;  
  6. }  
  7. -(id)initWithNumeration:(int)a:denominator:(int) b;  
  8. -(void) print;  
  9. @end  

Fraction.m:

[cpp]  view plain copy
  1. #import <stdio.h>  
  2. #import "Fraction.h"  
  3.   
  4. @implementation Fraction  
  5. -(id)initWithNumeration:(int)a:denominator:(int) b {         
  6.     self = [super init];  
  7.     if(self) {  
  8.        numerator   = a;  
  9.        denominator = b;  
  10.     }  
  11.   
  12.     return self;  
  13. }  
  14.   
  15. -(void) print {  
  16.    printf("Fraction: %i/%i", numerator, denominator);  
  17. }  
  18.   
  19. @end  

2,定义子类:


FractionChild.h:

[cpp]  view plain copy
  1. #import "Fraction.h"  
  2. @interface FractionChild : Fraction   
  3. -(void) print;  
  4. @end  

FractionChild.m:

[cpp]  view plain copy
  1. #import <stdio.h>  
  2.   
  3. #import "FractionChild.h"  
  4.   
  5. @implementation FractionChild  
  6. -(void) print {  
  7.    printf("FractionChild: %i/%i", numerator, denominator);  
  8. }  
  9.   
  10. @end  

3, 开始用FractionChild 冒充Fraction
main.m:

[cpp]  view plain copy
  1. #import <stdio.h>  
  2. #import "Fraction.h"  
  3. #import "FractionChild.h"  
  4.   
  5. int main(int agrc, const char * agrv[]) {  
  6.      Fraction *frac = [[Fraction alloc]initWithNumeration:3:denominator:4];  
  7.      [frac print]; //此时输出:Fraction: 3/4  
  8.   
  9.   
  10.      //make FractionChild posing as Fracition,注意:poseAsClass这个方法是NSObject的一个内置方法,用于子类posing父类。  
  11.   
  12.      [FracitonChild poseAsClass [Fraction class]];  
  13.   
  14.   
  15.      Fraction *frac2 = [[Fraction alloc]initWithNumeration:3:denominator:4];  
  16.      [frac2 print]; //此时输出:FractionChild: 3/4,此时的Fration表现行为便被FractionChild冒充了  
  17.   
  18.      [frac release];  
  19.      [frac2 release];  
  20. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值