iOS开发基础-多态

iOS开发基础-多态

多态

1.多态的概念

css 复制代码
多态简单来说就是多重状态,是不同的对象以自己的方法去响应消息的能力,就是一个对象是A类,但是他也可以是B类,这个是基于OC的动态语言的特性在编译时决定的,是OC的一个基本且重要的特性。而多态在OC中的主要是用继承来体现的。
在OC的实现中,一般使用继承的方法来实现类的扩展,一般来说就是通过子类去覆盖和重载父类的方法,来达到对同一类对象的同一方法的调用产生不同的结果。(即 父类的指针指向了子类对象)

2.简单的例子

less 复制代码
@interface familyPeople : NSObject
- (void) familyPeopleName:(MultiPersion *)animal;
@end

#import "familyPeople.h"

@implementation familyPeople
- (void)familyPeopleName:(MultiPersion *)animal {
    [animal namePersion];
}
@end
less 复制代码
@interface** MultiPersion : NSObject
- (void)namePersion;
@end

#import "MultiPersion.h"
@implementation** MultiPersion
-(void)namePersion {}
@end


#import "MultiPersion.h"
@interface** MultiPersionMan : MultiPersion
@end

#import "MultiPersionMan.h"
@implementation** MultiPersionMan
- (void)namePersion {
    NSLog(@"男人");
}
@end


#import "MultiPersion.h"
@interface** MultiPersionWomen : MultiPersion
@end

#import "MultiPersionWomen.h"
@implementation** MultiPersionWomen
- (void)namePersion {
    NSLog(@"女人");
}
@end

在上面的代码中,MultiPersionWomen和MultiPersionMan就是继承于MultiPersion。 当在familyPeople传入的是他们的父类MultiPersion,但是在实际调用中可以传入他们的子类并调用子类的方法即 父类的指针指向了子类对象

ini 复制代码
familyPeople *family = [[familyPeople alloc]init];
MultiPersionWomen *women = [[MultiPersionWomen alloc]init];
MultiPersionMan *man = [[MultiPersionMan alloc]init];
[family familyPeopleName:women];
[family familyPeopleName:man];

由上面的简单例子可以看出 实现多态,需要两个类之间有继承关系,子类重写了父类的方法或者声明了一个新的方法供调用,且父类的指针指向了继承的子类,注意 OC支持方法名的多态,但不支持参数和操作符的多态。

3.多态的原理和条件

多态的实现原理来自于 动态绑定,因为动态类型能使程序直到执行时才确定对象的真实类型且动态类型绑定能使程序直到执行时才确定要对那个对象调用的方法。 而为了实现这一功能是通过一个叫做selector的选取器实现的。selector有两个意思, 当用在给对象的源码消息时,用来指方法的名字。它也指那个在源码编译后代替方法名的唯一的标识符。编译后的选择器的类型是SEL有同样名字的方法、也有同样的选择器。你可以使用选择器来调用一个对象的方法。

selector的特点是:

选取器确定的是方法名,而不是方法实现。这是多态性和动态绑定的基础,它使得向不同类对象发送相同的消息成为现实;否则,发送 消息和标准C中调用方法就没有区别,也就不可能支持多态性和动态绑定。

另外,同一个类的同名类方法和实例方法拥有相同的选取器。 消息机制通过选取器找到方法的返回值类型和参数类型,因此,动态绑定(例:向id定义的对象发送消息)需要同名方法的实现拥有相 同返回值类型和相同的参数类型;否则,运行时可能出现找不到对应方法的错误。

  • 所有同名的方法拥有同样的选取器
  • 所有的选取器都是不一样的
选择器的类型是 SEL。@selector指示符用来引用选择器,返回类型是SEL。
ini 复制代码
SEL responseSEL;      
responseSEL = @selector(loadDataForTableView:);  
responseSEL = NSSelectorFromString(@"loadDataForTableView:");

可以通过上面大方法来获取选取器selector

相关推荐
乐迪绘防伪油墨技术分享1 小时前
特种功能油墨选型指南:温变 / 遇水 / 荧光 / UV LED 技术对比与供应商参考
前端·html·uv
cll_8692418911 小时前
WordPress Single Post 文章页美化:响应式表格、图片优化与自动悬浮 Table of Contents(CSS + JS)
前端·css
爱勇宝1 小时前
用了一个月 WorkBuddy,聊聊我的真实感受
前端·后端·程序员
愛芳芳1 小时前
基于 Electron + Vue3 的仿 PC 微信客户端项目实战
前端·javascript·css·elementui·typescript·electron·vue
你别说话了2 小时前
Vue实现高效拖拽效果 vue-Draggable
前端·vue.js
万物智能2 小时前
PWM散热风扇设置—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
前端·后端·算法
前端柱子2 小时前
q-floodfill白边锯齿?一招搞定抗锯齿边缘问题
前端
阿虎儿2 小时前
我的 HTML 样板(HTML Boilerplate)
前端·html
Amos_Web2 小时前
Rspack 源码解析(八):Module、Chunk 与 Runtime ID
前端·rust·源码阅读
彭于晏分晏2 小时前
深入理解 Vue 3 响应式原理:从 Proxy 到依赖收集
前端