美文网首页
Objective-C 的“多继承”

Objective-C 的“多继承”

作者: 狼凤皇 | 来源:发表于2016-02-04 16:19 被阅读42次

当单继承不够用,很难为问题域建模时,我们通常都会直接想到多继承。多继承是从多余一个直接基类派生类的能力,可以更加直接地为应用程序建模。但是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]) {

returndoctor;

}

returnnil;

}

虽然消息可以动态转发传递,但是编辑器的静态检查是绕不过的,那么问题来了,既然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就相对灵活,而且隐藏了我要转发的消息。

相关文章

  • 【潮汐】iOS面试题-WLKJI(2019年6月)(2)

    1、Object-c有多继承吗?没有的话用什么代替? Objective-c只支持单继承,如果要实现多继承的话,可...

  • Objective-C 的“多继承”

    当单继承不够用,很难为问题域建模时,我们通常都会直接想到多继承。多继承是从多余一个直接基类派生类的能力,可以更加直...

  • Objective-C 的“多继承”

    当单继承不够用,很难为问题域建模时,我们通常都会直接想到多继承。多继承是从多余一个直接基类派生类的能力,可以更加直...

  • iOS多继承的实现及区别

    多继承可以允许子类从多个父类派生,而Objective-C并不支持多继承,但我们仍可间接实现。 Objective...

  • iOS开发中怎样使用多继承

    其实, 在Objective-C中, 已经取缔了C++这样的多继承, 但是面试官在拷问你多继承如何实现的时候, 千...

  • iOS多继承的实现及区别

    简介 多继承可以允许子类从多个父类派生,而Objective-C并不支持多继承,但我们仍可间接实现。 Object...

  • Objective-c 实现“多继承”

    假设C类要同时继承A类和B类,则称之为多继承。而Objective-C不支持多继承,由于消息机制名字查找发生在运行...

  • ios之“多代理”,“多继承”,以及动态调用类方法实例方法

    一、多代理,多继承 对于Objective-C来说是不支持多继承的,由于消息机制名字查找发生在运行时而非编译时,很...

  • NSProxy实现伪多继承

    Objective-C是不支持多继承的,但是基于消息转发机制我们可以使用NSProxy来实现伪多继承。 1.关于N...

  • 一些总结

    1.虽然Objective-C在语法上禁止类使用多继承,但是在协议的遵守上却允许使用多继承。所以可以用协议来实现多...

网友评论

      本文标题:Objective-C 的“多继承”

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