iOS开发Objective-C基础之──多态

Objective-C语言是面向对象的高级编程语言,因此,它具有面向对象编程所具有的一些特性,即:封装性、继承性和多态性。

今天介绍一下Objective-C中的多态性。

 

      一、什么是多态

 

      多态:不同对象以自己的方式响应相同的消息的能力叫做多态。

      由于每个类都属于该类的名字空间,这使得多态称为可能。类定义中的名字和类定义外的名字并不会冲突。类的实例变量和类方法有如下特点:

  • 和C语言中结构体中的数据成员一样,类的实例变量也位于该类独有的名字空间。

  • 类方法也同样位于该类独有的名字空间。与C语言中的方法名不同,类的方法名并不是一个全局符号。一个类中的方法名不会和其他类中同样的方法名冲突。两个完全不同的类可以实现同一个方法。

      方法名是对象接口的一部分。对象收到的消息的名字就是调用的方法的名字。因为不同的对象可以有同名的方法,所以对象必须能理解消息的含义。同样的消息发给不同的对象,导致的操作并不相同。

      多态的主要好处就是简化了编程接口。它容许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字。这样,编程接口就是一些抽象的行为的集合,从而和实现接口的类的区分开来。

      Objective-C支持方法名的多态,但不支持参数和操作符的多态。

 

     二、在Objective-C中如何实现多态

 

     在Objective-C中是通过一个叫做selector的选取器实现的。在Objective-C中,selector有两个意思, 当用在给对象的源码消息时,用来指方法的名字。它也指那个在源码编译后代替方法名的唯一的标识符。 编译后的选择器的类型是SEL有同样名字的方法、也有同样的选择器。你可以使用选择器来调用一个对象的方法。

 

     选取器有以下特点:

     * 所有同名的方法拥有同样的选取器

     * 所有的选取器都是不一样的

 

     (1) SEL和@selector

          选择器的类型是 SEL。@selector指示符用来引用选择器,返回类型是SEL。

          例如:

         SEL responseSEL;      

                responseSEL = @selector(loadDataForTableView:);     

         可以通过字符串来得到选取器,例如:

               responseSEL = NSSelectorFromString(@"loadDataForTableView:");

         也可以通过反向转换,得到方法名,例如:

               NSString  *methodName = NSStringFromSelector(responseSEL);

 

     (2) 方法和选取器

 

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

         另外,同一个类的同名类方法和实例方法拥有相同的选取器。

     (3) 方法返回值和@参数类型

 

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

         有一个例外,虽然同名灶方法和实例方法拥有相同的选取器,但是它们可以有不同的参数类型和返回值类型。

转载于:https://www.cnblogs.com/lm3515/p/3338409.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react学习(7)----react转换值同render

{title: 状态,dataIndex: status,render: (text, row) > {let arr [, 未开始, 进行中, 已结束, 已作废];return <span>{arr[text]}</span>;},},

数据科学家令人惊叹的排序技巧

2019 年第 80 篇文章&#xff0c;总第 104 篇文章本文大约 7800 字&#xff0c;阅读大约需要20分钟原题 | Surprising Sorting Tips for Data Scientists作者 | Jeff Hale原文 | https://towardsdatascience.com/surprising-sorting-tips-for-data-scientists-9c360776d7e译者 …

删除Autorun.inf的方法

你的电脑的每个分区根目录都有一个autorun.inf的文件夹&#xff0c;查看属性是只读隐藏&#xff0c;且无法删除、无法取得权限!点进去&#xff0c;却显示的是控制面板的内容? 其实这个不是病毒&#xff0c;而是用来防病毒&#xff0c;一些系统封装工具本身就自带。下面教你删…

react学习(8)----数组方法fliter简介

filter() 方法创建一个新的数组&#xff0c;新数组中的元素是通过检查指定数组中符合条件的所有元素。 注意&#xff1a; filter() 不会对空数组进行检测。 注意&#xff1a; filter() 不会改变原始数组。

几个有趣的python技巧

2019 年第 82 篇文章&#xff0c;总第 106 篇文章标题 | python-is-cool作者 | chiphuyen原文 | https://github.com/chiphuyen/python-is-cool译者 | kbsc13("算法猿的成长"公众号作者)声明 | 翻译是出于交流学习的目的&#xff0c;欢迎转载&#xff0c;但请保留本文…

react学习(9)----react生命周期

react生命周期1.1.constructor() constructor()中完成了React数据的初始化&#xff0c;它接受两个参数 &#xff1a;props和context&#xff0c;当想在函数内部使用这两个参数时 &#xff0c;需使用super()传入这两个参数。 注意&#xff1a;只要使用了constructor()就必须写su…

TOP 命令

转自&#xff1a;top命令.http://www.cnblogs.com/wangkangluo1/archive/2012/04/18/2454993.html#stat.2013-05-25 top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。下面详细介绍它的使用方法…

20191215周学习总结

最近会打算每周总结一下学习的内容&#xff0c;主要内容可能是看过的书的一些学习笔记、论文阅读、学习的知识点以及推荐一些文章。这周的学习包括&#xff1a;推荐系统的知识点整理机器学习的技巧学习linux下两台机器的ssh免密登陆方式书籍阅读效率方法推荐系统因为工作方向的…

玩转12306之系统登录

【申明&#xff1a;本文所涉及的技术和分析的目的都是为了学习和交流&#xff0c;任何人使用文中所提的技术或成果做出的违法事情与我无关&#xff0c;大家购买火车票还是去12306官网上去购买。】 从今天起&#xff0c;我开始分析12306网站的Http请求&#xff0c;以及编写一个客…

react学习(10)----react数组定义 从0开始 直接加个0下标空

{title: 状态,dataIndex: status,render: (text, row) > {let arr [, 未开始, 进行中, 已结束, 已作废];return <span>{arr[text]}</span>;},},

Nginx快速搭建和基本使用

2019年第 83 篇文章&#xff0c;总第 107 篇文章最近在工作中项目需要上线&#xff0c;所以也了解到关于一些部署上线的知识内容&#xff0c;Nginx 就是其中一个知识点&#xff0c;主要是可以用它来进行负载均衡&#xff0c;本文的目录如下&#xff1a;简介安装配置基本使用简介…

对于mysql的用户权限管理

转载链接&#xff1a;http://www.cnblogs.com/ymy124/archive/2012/05/23/2514196.html 1.新建用户 //登录MYSQL>mysql -u root -p>密码//创建用户mysql> insert into mysql.user(Host,User,Password) values(‘localhost’,jeecn’,password(‘jeecn’));//刷新系统权…

第二期周总结

第二期的周总结&#xff0c;这次学习的内容可能没有上次那么广泛&#xff0c;主要是因为这周我负责的模块需要测试并进行上线&#xff0c;所以主要学习了解的就是工程开发方面的内容&#xff0c;准确说是部署上线的内容&#xff0c;所以本周主要简单总结这次上线过程的一些内容…

react学习(12)-moment插件设置日期格式

<p>{moment(boothDetails.startTime).format(YYYY-MM-DD)}到{moment(boothDetails.endTime).format(YYYY-MM-DD)}</p>

AI知识点(1)--激活函数

2019年第 84 篇文章&#xff0c;总第 108 篇文章本文大约 5000 字&#xff0c;阅读大约需要 15 分钟AI知识点&#xff08;AI Knowledge&#xff09;系列第一篇文章--激活函数。本文主要的目录如下&#xff1a;激活函数的定义为什么需要激活函数常见的激活函数1. 激活函数的定义…

oracle分区

oracle 分区技术&#xff1a;使用分区技术&#xff0c;Oracle允许把一个大表分成几个部分&#xff0c;每部分叫一个分区&#xff0c;然后把每个部分放在不同的物理磁盘&#xff0c;以提高整个数据库的性能。分区技术的优点&#xff1a;1.分区技术使数据库的可管理性变得更加容易…

react学习(13)-moment中 isRangePicker 控制类型

<Col span{8} key{index}><Form.Item label{item.label} {...formItemLayout}>{getFieldDecorator(${item.paramsName}, {})(item.isRangePicker ? (<RangePickershowTime{item.showTime ? item.showTime : false}style{{ width: 100% }}allowClear/>) : (…

Linux 定时执行shell 脚本

2019年第 85 篇文章&#xff0c;总第 109 篇文章本文大约2000字&#xff0c;阅读大约需要6分钟crontab 可以在指定的时间执行一个shell脚本以及执行一系列 Linux 命令。定时执行shell 脚本简单给出执行 shell 脚本的步骤。首先是编写一个测试脚本--test.sh# 创建脚本 $ vim tes…

react学习(14)-getTime是对时间进行处理的方法

{name: data?.name,startTimeLong: new Date(data?.code[0]).getTime(),endTimeLong: new Date(data?.code[1]).getTime(),},() > {this.getFrameList();}

同余定理

http://www.cnblogs.com/zhixingqiezhixing/archive/2012/04/03/2430676.html http://blog.sina.com.cn/s/blog_6e223f1d0101bkry.html 转载于:https://www.cnblogs.com/thefirstfeeling/p/4410970.html