Runtime(四)模拟多继承的实现
思想
iOS中是不允许多继承的,一个类既可以同时实现其他两个类的方法。一般有两种方式,一种是将这两个类的对象作为参数传入去调用各自的方法,另一种是通过代理协议的方式实现。但追其根本还是通过这两个类进行的方法调用。
我们可以利用runtime,模拟实现多继承的效果,通过消息转发机制中的第三步,方法签名和消息转发可以实现当前类调用方法,转发到对应的实现的类中去实现。
代码
【Runtime(四)模拟多继承的实现】定义两个类,各自声明实现各自的方法。通过协议的方式去声明方法。
#import NS_ASSUME_NONNULL_BEGIN@protocol FruitsProviderProtocol- (void)buyFruits:(NSString *)fruits;
@end@interface FruitsProvider : NSObject@endNS_ASSUME_NONNULL_END#import "FruitsProvider.h"@interface FruitsProvider() @end@implementation FruitsProvider- (void)buyFruits:(NSString *)fruits
{
NSLog(@"fruits: %@",fruits);
}
#import NS_ASSUME_NONNULL_BEGIN@protocol RestaurantProviderProtocol- (void)order:(NSString *)orderName;
@end@interface RestaurantProvider : NSObject@endNS_ASSUME_NONNULL_END#import "RestaurantProvider.h"@interface RestaurantProvider() @end@implementation RestaurantProvider- (void)order:(NSString *)orderName
{
NSLog(@"order: %@",orderName);
}@end
定义一个类,通过遵守协议的方式,将另外两个类的方法引入。
#import
#import "FruitsProvider.h"
#import "RestaurantProvider.h"NS_ASSUME_NONNULL_BEGIN// NSProxy
//抽象的类,虚类,NSProxy没有构造方法,自己去提供构造方法,并且复写方法签名和消息转发两个方法。
@interface TakeOutProxy : NSProxy - (instancetype)init;
@endNS_ASSUME_NONNULL_END
自定义构造方法,重写init方法,先将两外两个类的方法列表获取到,保存在一个字典中。当外部通过这个类调用方法的时候,由于该类中没有实现这个方法,因此会走消息转发的流程,对当前调用的方法重新签名,通过方法名找到对应实现这个方法的类,将这个消息转发给这个类的对象。从而实现方法的调用。
#import "TakeOutProxy.h"
#import @interface TakeOutProxy(){
NSMutableDictionary *_methodDict;
}@end@implementation TakeOutProxy//多继承 继承两个类的方法和实现
//解决方法1:通过把这两个类的对象传进来,通过这两个类分别调用两个方法实现。
//解决方法2:通过协议的方式实现。
//这两个方法本质上都是原来的类去实现的这个方法。
//复写方法签名和消息转发两个方法//通过协议的方式+ (instancetype)takeOutProxy
{
return [[TakeOutProxy alloc]init];
}- (instancetype)init
{
_methodDict = [NSMutableDictionary dictionary];
[self registerMethodTarget:[FruitsProvider new]];
[self registerMethodTarget:[RestaurantProvider new]];
return self;
}//将两个类的方法遍历,存放在一个字典中
- (void)registerMethodTarget:(id)target {unsigned int count = 0;
//runtime 获取方法列表
Method *method_list = class_copyMethodList([target class], &count);
for (int i = 0;
i
推荐阅读
- 跌跌撞撞奔向你|跌跌撞撞奔向你 第四章(你补英语,我补物理)
- 奔向你的城市
- 四首关于旅行记忆的外文歌曲
- CET4听力微技能一
- 亲子日记第186篇,2018、7、26、星期四、晴
- 特种兵训练第四天
- 第四十三篇接纳孩子的感受
- 《自我的追寻》读书笔记3
- 不让记忆、感觉、情绪成为孩子的负累|不让记忆、感觉、情绪成为孩子的负累|《全脑教养法》(四)
- 亲子日记第三百四十二篇|亲子日记第三百四十二篇 暴雨