iOS 不支持多继承,实现多继承的4种方式

classA 实现了methodA  方法  classB 实现了 methodB 方法   classC 要同时实现methodA和methodB方法 在C++ 中用多继承就能实现,但是Objective c 不支持多重继承,那如何实现。

方法1. 组合方式,用ClassC  添加ClassA ,ClassB成员变量 来调用methodA,methodB

 

//定义ClassA以及其methodA

 

@interface ClassA : NSObject {

}

 

-(void)methodA;

 

@end

//定义ClassB以及其methodB

@interface ClassB : NSObject {

}

 

-(void)methodB;

 

@end

//定义ClassC以及其需要的methodA,methodB

@interface ClassC : NSObject {

  ClassA *a;

  ClassB *b;

}

 

-(id)initWithA:(ClassA *)A b:(ClassB *)B;

 

-(void)methodA;

-(void)methodB;

 

@end

 

//注意在ClassC的实现

@implementation  ClassC

-(id)initWithA:(ClassA *)A b:(ClassB *)B{

       a=[[ClassA alloc] initWithClassA: A];//[A copy];

       b=[[ClassB alloc] initWithClassB: B];//[B copy];

}

-(void)methodA{

      [a methodA];

 

}

-(void)methodB{

 

      [b methodB];

}

 

方法2.协议protocol  设置ClassA delegate和 ClasssB delegate 以及实现方法ClassA里的methodA,和ClasssB里的methodB。ClassC遵守这两个协议就可以。

方法3.类别  ClassC的类别 可以实现ClassA的methodA和ClassB的methodB两个方法,这样ClassC就可以调用methodA和methodB

方法4.消息转发机制

我们知道objective-c中调用方法的方式是发消息,那如果给一个实例对象发一个未定义的消息呢?结果就是crash,其实这中间系统给我们第二次机会,就是可以转发该消息

如果未调到定义的消息,runtime会给该实例第二次机会,首先调用methodSignatureForSelector 或去方法签名,然后调用forwardInvocation,如果用户自己定义的类,没有重写这两个方法,即不支持方法转发

  1. @interface LOCBird : NSObject {  
  2.     NSString* name_;  
  3.       
  4. }  
  5. @end  
  6.   
  7.   
  8. @implementation LOCBird  
  9.   
  10. - (id)init  
  11. {  
  12.     self = [super init];  
  13.     if (self) {  
  14.         name_ = [[NSString alloc] initWithString:@"I am a Bird!!"];  
  15.           
  16.     }  
  17.     return self;  
  18. }  
  19.   
  20. - (void)dealloc  
  21. {  
  22.     [name_  release];  
  23.     [super dealloc];  
  24. }  
  25.   
  26. - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector  
  27. {  
  28.     NSMethodSignature* signature = [super methodSignatureForSelector:aSelector];  
  29.     if (signature==nil) {  
  30.         signature = [name_ methodSignatureForSelector:aSelector];  
  31.     }  
  32.     NSUInteger argCount = [signature numberOfArguments];  
  33.     for (NSInteger i=0 ; i<argCount ; i++) {  
  34.         NSLog(@"%s" , [signature getArgumentTypeAtIndex:i]);  
  35.     }  
  36.     NSLog(@"returnType:%s ,returnLen:%d" , [signature methodReturnType] , [signature methodReturnLength]);  
  37.     NSLog(@"signature:%@" , signature);  
  38.     return signature;  
  39. }  
  40.   
  41. - (void)forwardInvocation:(NSInvocation *)anInvocation  
  42. {  
  43.     NSLog(@"forwardInvocation:%@" , anInvocation);  
  44.     SEL seletor = [anInvocation selector];  
  45.     if ([name_ respondsToSelector:seletor]) {  
  46.         [anInvocation invokeWithTarget:name_];  
  47.     }  
  48.       
  49. }  
  50.   
  51. @end  

 多继承消息转发原理就是  ClassC 没法实现methodA 和methodB 但是有成员变量ClassA 实力和ClassB实例。可以在用ClassC调用methodA 和methodB方法的时候消息转发给对应的实例就不会导致crash。其实和1组合方式类似。

主要参考链接:

http://blog.csdn.net/freshforiphone/article/details/7381329

有不对地方欢迎指出

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Asia_ZhangQQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值