美文网首页
ios多重继承的实现

ios多重继承的实现

作者: 幻影形風 | 来源:发表于2019-02-16 19:19 被阅读0次

ios没有直接的多重继承的实现机制,但可以从其他方面来实现类似的效果。

方式一:

采用组合、聚合的方式,比较常见。

方式二:

采用Runtime的机制,进行代理和消息分发的处理。下面阐述下以下实现方式:

1. 子类继承自NSProxy。这里定义了个基类来实现:

#import

NS_ASSUME_NONNULL_BEGIN

/*

 作者:jolly

 类名:BaseProxy

 作用描述:代理类的基类,可以实现多继承自多个target的方法和变量

 */

@interface BaseProxy :NSProxy

/*

 作者:jolly

 函数名:init

 功能说明:初始化方法

 入参描述:

 返回值描述: BaseProxy对象

 */

- (instancetype)init;

- (void)addTarget:(id)target; //添加当个被继承的对象。

- (void)addTargets:(NSArray*)targets; //添加多个被继承的对象

- (void)removeTarget:(id)target; //移除被代理对象 

- (void)removeAll;  //移除所有的被代理对象 

/*

 作者:jolly

 函数名:methodNotFound

 功能说明:在runtime没有找到对应的selector的时候,触发该方法的调用,代理类无响应具体的selector时触发下面的回调。

 */

- (void)methodNotFound:(SEL)aSeletor;

@end

NS_ASSUME_NONNULL_END

实现方式,

//步骤1,方法实现方法签名的映射

- (NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector

{

    NSMethodSignature * sg = nil;

    for(id delegate in self.targets) {

        sg = [delegate methodSignatureForSelector:aSelector];

        if(sg !=nil) {

            break;

        }

    }

    returnsg;

}

//若此处没有找到对应的转发处理,则报出unrecognized selector sent to instance错误。

//步骤2 1对多转发

- (void)forwardInvocation:(NSInvocation*)anInvocation

{

    NSLog(@"forwardInvocation ==== [%@]",anInvocation);

    for(idtargetinself.targets) {

        [anInvocationinvokeWithTarget:target];

    }

}

- (void)doesNotRecognizeSelector:(SEL)aSelector

{

    [selfmethodNotFound:aSelector];

}

- (void)methodNotFound:(SEL)aSeletor

{

    NSLog(@"methodNotFound ==== [%@]",NSStringFromSelector(aSeletor));

}

以上是代理类的基类的实现。

接下来,真正的实现类的处理步骤。

A. 定义被继承的协议接口等。本例如下:

//公共协议

@protocol ObjAProto

@property(nonatomic,copy)NSString * userName;

- (void)hello:(NSString*)name;

@end

B. 实际代理类的实现:

@interface ObjProxy : BaseProxy<ObjAProto>

@end

@implementation ObjProxy

-(void)methodNotFound:(SEL)aSeletor  //未找到相应的代理方法,而触发的回调。

{}

@end

C. 实际被代理的类的实现:

@interface ObjA : NSObject<ObjAProto>

@end

@implementation ObjA

- (void)hello:(NSString*)name

{

    NSLog(@"%@", [@"hi jolly,that's mime " stringByAppendingString:name]);

}

- (NSString*)userName

{

    return @"jolly.wu";

}

@synthesize userName;

@end

D. main函数的调用方式:

ObjProxy * py = [[ObjProxy alloc] init];

        [py addTarget:[ObjA new]];

        [py hello:@"jon"]; //实则调用ObjA实例里面的方法。

以上就是整体的多重继承的实现方式原理。注意代理类中若实现了被代理对象的方法相当于实现了消息的拦截,则不会触发消息转换流程,也就不会走到proxy里面的具体代理调用了。具体的可以参照https://github.com/jolly-wu/XibInHerit的实现。

相关文章

  • Java中关于多重继承的问题

    多重继承的含义 一.用接口实现多重继承 二.用内部类实现多重继承

  • iOS面试120个基础知识点及面试题

    1.OC的类可以多重继承吗?可以实现多个接口吗?要想实现类似多重继承如何实现?答:OC不可以实现多重继承。可以实现...

  • ios多重继承的实现

    ios没有直接的多重继承的实现机制,但可以从其他方面来实现类似的效果。 方式一: 采用组合、聚合的方式,比较常见。...

  • iOS封装、继承、多态

    0、iOS中面向对象3个特征:封装、继承、多态 1、iOS不支持多重继承,需要用遵循多个协议来实现 2、面向对象的...

  • ios xib的多重继承实现

    对于重用xib进行开发的朋友,往往遇到一些很现实的问题,如xib嵌套,无法重用继承等,导致xib的数量泛滥,UI类...

  • 消息转发与关联类

    消息转发分为快速消息转发和完全消息转发,实现了多重继承的功能。 Objective并不实现多重继承的功能。只能实现...

  • [读] JS中的call()和apply()方法

    JS中的call()和apply()方法 实现继承 多重继承

  • 潭州ios面试题2

    1 继承 1>如何实现多重继承 消息转发 forwardingTargetForSelector methodSi...

  • Python多重继承(拓扑排序)(9)

    Python跟Java不同,Java只能单继承(不过有多实现),而Python能够多重继承。其多重继承遵循拓扑排序...

  • IOS面试题(一)

    Object-c的类可以多重继承么?可以实现多个接口么? Object-c的类不可以多重继承;可以实现多个接口,通...

网友评论

      本文标题:ios多重继承的实现

      本文链接:https://www.haomeiwen.com/subject/wlmkkttx.html