问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ios中有什么方式支持多继承

发布网友 发布时间:2022-05-24 04:04

我来回答

1个回答

热心网友 时间:2024-12-05 01:28

当单继承不够用,很难为问题域建模时,我们通常都会直接想到多继承。多继承是从多余一个直接基类派生类的能力,可以更加直接地为应用程序建模。但是Objective-C不支持多继承,由于消息机制名字查找发生在运行时而非编译时,很难解决多个基类可能导致的二义性问题。不过其实 Objective-C 也无需支持多继承,我们可以找到如下几种间接实现多继承目的的方法:

消息转发  

delegate和protocol  

类别   

消息转发

当向someObject发送某消息,但runtime system在当前类和父类中都找不到对应方法的实现时,runtime system并不会立即报错使程序崩溃,而是依次执行下列步骤:

分别简述一下流程:

    

1.动态方法解析 

      向当前类发送 resolveInstanceMethod: 信号,检查是否动态向该类添加了方法。(迷茫请搜索:@dynamic)

2.快速消息转发

      检查该类是否实现了 forwardingTargetForSelector: 方法,若实现了则调用这个方法。若该方法返回值对象非nil或非self,则向该返回对象重新发送消息。

3.标准消息转发

      runtime发送methodSignatureForSelector:消息获取Selector对应的方法签名。返回值非空则通过forwardInvocation:转发消息,返回值为空则向当前对象发送doesNotRecognizeSelector:消息,程序崩溃退出。

 

    顾名思义,我们可以利用上述过程中的2、3两种方式来完成消息转发。

快速消息转发的实现方法很简单,只需要重写 - (id)forwardingTargetForSelector:(SEL)aSelector  方法即可。

我来举个简单的例子,比如现有2个类:Teacher 和 Doctor,Doctor可以做手术(operate方法)。


@interface Teacher : NSObject  

  

@end  


@interface Doctor : NSObject  

  

- (void)operate;  

@end  



通过快速消息转发,可以很轻松的让teacher调用doctor的方法做手术。

    

Teacher类需要实现将消息转发给Doctor:


- (id)forwardingTargetForSelector:(SEL)aSelector  

{  

    Doctor *doctor = [[Doctor alloc]init];  

    if ([doctor respondsToSelector:aSelector]) {  

        return doctor;  

    }  

    return nil;  

}  



虽然消息可以动态转发传递,但是编辑器的静态检查是绕不过的,那么问题来了,既然Teacher类没有实现operate方法又该如何声明呢?

到目前为止,我只想到下面2种方法:

    

声明方法1 ———— 类别

     

   

@interface Teacher (DoctorMethod)  

- (void)operate;  

  

@end  



声明方法2 ———— 导入头文件、调用时强转类型


    

Teacher类头文件需要包含Doctor头文件,告诉编译器去Doctor.h中可以找到operator方法的声明,并且在调用时强转类型。


Teacher *teacher = [[Teacher alloc]init];  

[(Doctor *)teacher operate];  


有兴趣可以思考一个问题:如果将其类型转成 id ,也可以编译通过,并实现转发。可是会带来什么隐患呢?

    

方法1使用类别足够清晰简便,为什么还要提出办法2呢 ? 我的想法是,方法1的弊端是抛出来的方法是定死的,而且在.h里露着;方法2就相对灵活,而且隐藏了我要转发的消息。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
电脑lol突然很卡怎么办啊电脑玩lolfps低怎么解决 危化品仓库有什么设备 香港中文大学2021-2022在河北,重庆最低录取分数线 ChaCheer 洽洽 南瓜子 盐焗味 500g-适用对象 老闫家小粒香南瓜子-适用对象 洽洽盐焗味南瓜子-适用对象 盐焗南瓜子里有添加明矾吗 老街口盐焗味南瓜子500g*2袋量大优惠休闲零食 一天走多少步可以减肥每天走多少步可以减肥 肉炖土豆需要炖多久时间 ios 通知中心可以传递数组吗 ios为什么有三次转发 7030LED灯珠电压多少伏?电流多少? 招商银行信用卡申请需要什么材料 怎样发出来的面做出来的包子又白又软 包子怎么做得宣软 银行卡能在电脑上查到余额吗 短信轰炸机”软件会对我们的手机造成怎样的危害 普洱是不是绿茶 什么播放器可以用网站的 手机用什么播放器可以用网址看 什么视频播放器可以输入网址查电影的 耳机插笔记本电脑上声音不正常 ...声音还是从外放喇叭出来,耳机却没有声音,耳机没有坏,不知道怎么了... 为什么耳机插在笔记本电脑上声音还是从音箱出来耳机里没有声音 9块9的衣服可以穿多少天 十三五发展理念是什么 如何树立创新发展理念 为什么必须牢固树立创新发展理念 请结合材料从科技创新的角度分析我国为什么要牢固树立创新的发展... ...HD1080p 23.97 和HD1080p 23.97(1.33PAR)有什么区 高清电视1080p和1080i有什么区别? 有这样的变声软件吗? IVT_BlueSoleil是否支持安卓系统 笔记本用蓝牙与我的安卓手机连接时,电脑上驱动里面显示bluetooth外围设 ... 安卓系统,手机蓝牙连接不到电脑,能匹配,怎么回事? 安卓系统使用无线蓝牙键盘的驱动软件 安卓蓝牙驱动问题,有适配器,求驱动 ...可外接蓝牙模块么?哪里有安卓系统的蓝牙驱动下载? 能帮忙搞定 蓝牙适配器对应的安卓系统的驱动吗?非常谢谢啊 不吃减肥药,怎样减肥会快点? 怎么才能快速减肥不吃减肥药 怎么减肥最快?不吃减肥药的情况下 怎样又快又有效地减肥,不是吃减肥药? 怎样可以快速的减肥?在不吃减肥药的情况下? 怎么才能快速减肥而不用吃减肥药和运动呢? 怎样才能快速减肥?我不想吃减肥药 不吃减肥药,怎么减肥快呀! 怎样快速减肥(不吃减肥药) 一小袋饼干大概多少克,就是零食店按斤称的那种小包装