objective-c posing

来源:互联网 发布:fresh 红茶面膜 知乎 编辑:程序博客网 时间:2024/05/21 08:00

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 plaincopy
  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 plaincopy
  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 plaincopy
  1. #import "Fraction.h"  
  2. @interface FractionChild : Fraction   
  3. -(void) print;  
  4. @end  

FractionChild.m:

[cpp] view plaincopy
  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 plaincopy
  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
原创粉丝点击