我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:彩66彩票 > 多态逻辑 >

【iOS沉思录】Objective-C中的多态性分析

归档日期:05-13       文本归类:多态逻辑      文章编辑:爱尚语录

  多态(Polymorphism),在面向对象语言中指的是同一个接口可以有多种不同的实现方式,OC中的多态则是不同对象对同一消息的不同响应方式,子类通过重写父类的方法来改变同一消息的实现,体现多态性。另外我们知道C++中的多态主要是通过virtual关键字(虚函数、抽象类等)来实现,具体来说指的是允许父类的指针指向子类对象,成为一个更泛化、容纳度更高的父类对象,这样父对象就可以根据实际是哪种子类对象来调用父类同一个接口的不同子类实现。

  举个简单例子来展示OC的多态实现。假设有一个动物父类Animal,其下有两个子类,一个是Dog,一个是Cat,父类有一个统一接口:shout,表示动物的叫声,父类对接口有一个默认实现,子类各自有自己的接口实现,继承关系如下:

  首先,Objective-C中不完全支持重载,网上很多人要么将重载和重写搞混,要么说OC不支持重载(当然按照重载严格定义说OC不支持重载也没错),事实上OC支持参数个数不同的函数重载。

  重载(overload):函数名相同,函数的参数列表不同(包括参数个数和参数类型),至于返回类型可同可不同。重载发生在同一个类的不同函数之间,是横向的。重载和多态性无关。

  重写(override):指的是virtual函数的重写,用来体现多态性,指的是子类不想继承使用父类的方法,通过重写同一个函数的实现实现对父类中同一个函数的覆盖,因此又叫函数覆盖。重写的函数必须和父类一模一样,包括函数名、参数个数和类型以及返回值,只是重写了函数的实现。重写发生于父类和子类之间,是纵向的。

  **隐藏:**OC中也没有隐藏,典型的C++中有,通过虚函数和父子类之间的函数重写进行区分,此处不再讨论。其中重载和重写是针对函数的,而隐藏除了函数还会针对成员变量。隐藏发生在父类和子类之间,隐藏指的是父类的同名函数或变量在子类中隐藏,其中只要函数同名就隐藏,不管参数相同与否。在子类中父类的同名函数或变量不可见,但在父类中依然存在。

  Swift是基于C语言和OC语言优化后更加完善的新型语言,摆脱了C的兼容性限制,采用安全的编程模式并且增加了一些新的特性使编程更加有趣、友好,适应语言发展的趋势和期望。函数重载作为多态性的一个部分在Swift中是支持的,可能也是考虑到要弥补OC中不完全支持函数重载的这一缺陷。OC不完全支持重载,因为OC学习者应该会发现同一个类中不允许定义函数名相同且参数个数相同的两个函数,无论参数类型和返回值类型相同与否。但是说完全不支持也太绝对,因为OC中允许定义函数名相同但参数个数不同的两个函数,也就是说OC支持参数个数不同的函数重载。

  例如,我们可以在一个类中定义两个参数个数不同的函数,调用时通过参数个数进行区分:

  可以看出OC可以通过参数个数实现函数重载,但是如果参数相同,无论参数和返回值类型相同与否都无法编译通过。下面的定义是无法通过xcode的编译的:

  问题:Object-C的类可以多重继承么?可以实现多个接口么?重写一个类的方式用继承好还是分类好?为什么?

  Objective-C的类只支持单继承,不可以多重继承。可以利用protocol代理协议实现多个接口,通过实现多个接口完成类似C++的多重继承;在Objective-C中多态特性是通过protocol协议或者Category类别来实现的。protocol协议定义的接口函数可以被多个类实现,Category类别可以在不变动原类的情况下进行函数重写或者扩展。

  一般情况用分类更好,因为用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。

  Cocoa中没有虚基类的概念,虚基类是C++中为了解决多重继承二义性问题的,而OC中只有单继承,要实现类似C++中的多继承,可以通过protocal协议来简单实现,因为一个类可以实现多个协议,类似于Java中一个类可以实现多个接口。

  刚刚看笔记觉得这两个概念有点模糊,然后仔细查了一下发现网上有很多误导性的解释,我现在加上自己的理解说一下。1.多态同一操作下作用于不同的类的实例时,将产生不同的执行效果。(Objective—C编程全...博文来自:王沂环的博客

  1.多态定义:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单的说:就是用基类的引用指向子类的对象。2.如何实现多态:C++中的多态只能通过指向基类类型的指针和引用来...博文来自:魏波

  当在多条继承路径上有一个公共的基类,在这些路径的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类、classCBase{};...博文来自:Unique-You的博客

  前面我们学习I2C、USB、SD驱动时,有没有发现一个共性,就是在驱动开发时,每个驱动都分层三部分,由上到下分别是:1、XXX设备驱动2、XXX核心层3、XXX主机控制器驱动   而需要我们编写的主要...博文来自:知秋一叶

  用一句话概括就是:事物在运行过程中存在不同的状态。先以教科书般举例说明,下文再举一个花木兰替父从军的例子帮助大家理解.多态的存在有三个前提:1.要有继承关系2.子类要重写父类的方法3.父类引用指向子类...博文来自:weixin_34122810的博客

  1.多态性多态性是个生物名词,用来表示生物体在生命周期中的不同形态,用在编程语言中则表示相同的方法名,但是却有不同的实现方式。或者说相同的名字,不同的类。我们来看一个书上的示例:#import//定义...博文来自:yuedong56的专栏

  多态的特性在iOS开发,尤其是在整个app的架构搭建当中,用的比较多,一般在比较大,复杂的app中应用广泛。理解多态,能够写出比较优雅的代码,设计出优秀的应用架构。抽象的打印机类PrinterPrin...博文来自:say__ever的专栏

  1、多态相同类型调用同一个方法呈现多种不同的行为特征就是多态当子类对象直接赋值给父类指针变量,父类*p=[子类new];,运行类型是子类,编译类型是父类,所以p不能调用子类单独实现的方法,如果子类重写...博文来自:No talent

  一、Linux设备的分类字符设备、块设备、网络设备,三种设备之间的区别是数据的交互模式,分别为:字节流、数据块、数据包。二、VFS核心结构体VFS核心结构体定义在”linux/fs.h”头文件中。1、...博文来自:light_in_dark的博客

  开发linux设备驱动程序并不是想象的那么难最近看了好多内核编程和驱动开发的教程,也参考了一些开发板上的例子。总结下来并不是想象的高不可及。开发驱动程序需要对 内核有一定的了解,并不是非要解读的多么透...博文来自:menuconfig的专栏

  设备驱动开发是Linux开发领域一个非常重要的部分,在Linux源码的85%都是驱动程序的代码。设备驱动开发不仅需要了解硬件底层的知识,还需要拥有操作系统的背景。驱动程序追求的是高效,稳定,驱动程序发...博文来自:chuhang_zhqr的博客

  优点:父类指针可以指向不同的子类对象;允许在多个类中定义同一个消息接口;、可以屏蔽不同子类对象之间的差异,写出通用代码;适应需求的不断变化。...博文来自:我的iOS王者之路

  《C++沉思录》基于作者在知名技术杂志发表的技术文章、世界各地发表的演讲以及斯坦福大学的课程讲义整理、写作而成,融聚了作者10多年C++程序生涯的线章,分别对C++语言的历史和特点、类和继承、STL与泛型编程、库的...

  《C++沉思录》基于作者在知名技术杂志发表的技术文章、世界各地发表的演讲以及斯坦福大学的课程讲义整理、写作而成,融聚了作者10多年C++程序生涯的线章,分别对C++语言的历史和特点、类和继承、STL与泛型编程、库的...

  类这个概念无非是数据和方法的集合,为什么我一直困惑呢?为什么不弄清楚呢?C++中的类这个概念里有4个函数比较特殊,像我这种以前有C经验的人可能一时难以适应,它们是构造函数、析构函数、复制构造函数和赋值...博文来自:flora_yao的博客

  1998年4月30日Jaynes去世。此前,他曾经要我完成并出版他的这本关于概率论的书。为此,我曾纠结了一段时间。因为我认为Jaynes毫无疑问想完成这本书;但不幸的是,这本书后面的许多章节(也...博文来自:shoreman的专栏

  前面我们已经学习了platform设备的理论知识Linux设备驱动开发——platform设备驱动 ,下面将通过一个实例来深入我们的学习。    一、platform驱动的工作过程     platf...博文来自:知秋一叶

  C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言。我们今天就会为大家详细介绍其中C++多态性的一些基本知识,以方便大家在学习过程中对此能够有一个充分的掌握。多态性可以简单地概括为“一...博文来自:Hackbuteer1的专栏

  基础性总结1,linux驱动一般分为3大类:*字符设备*块设备*网络设备2,开发环境构建:*交叉工具链构建*NFS和tftp服务器安装3,驱动开发中设计到的硬件:*数字电路知识*ARM硬件知识*熟练使...博文来自:viewsky11的专栏

  继承封装多态 1.1继承编写面向对象的程序时,你所创建的类和对象之间存在一定的关系。他们协同工作才能实现程序相应的功能。创建一个新类时,通常需要定义新类以区别与其他类及现有类。使用继承可以定义一个具有...博文来自:张茫原

  多态:简单的定义就是父类指针指向子类对象多态的使用注意事项:父类能调用子类的方法吗?1、同名方法一定可以调用2、不同名方法:1)父类访问子类特有的方法,需要强制类型转换         例如:父类An...博文来自:jiangchunmeng_self的博客

  多态其实就是一种类的抽象,我们把某些有共性的对象进行抽象成为父类,然后再为每个不同对象赋予特定的属性。比如说猫狗什么,都可以抽象为宠物,然后你可以规定一些宠物的属性和方法,你想把它当猫就可以添加猫的特...博文来自:永远在跟随,从未去超越

  多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用CharlieCalverts对多态的描述——多态性是允许你将父对象设置成为和...博文来自:u010367539的专栏

  什么是KVC和KVO?答:KVC(Key-Value-Coding)内部的实现:一个对象在调用setValue的时候,(1)首先根据方法名找到运行方法的时候所需要的环境参数。(2)他会从自己isa指针...博文来自:PuRuiLing的博客

  图形虚基类,定义计算面积跟周长的函数。派生出圆形,三角形,矩形子类,并重新定义基类计算面积与周长的函数。注意:当基类的指针指向派生类的时候,只能操作派生类中从基类中继承过来的数据。 虚基类: clas...博文来自:不积跬步无以至千里

  面向对象的三个基本特征是:封装、继承、多态。封装简介封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被成为抽象数据类型。封装的意义在于保...博文来自:李鴻耀

  段1:因为板之间的虚粒子或真空涨落较少,它们相比外面区域拥有较低的能量密度。但远离板的空虚空间的能量密度必须为零,否则它会弯曲时空,而宇宙就不会是几坦的。因此,板之间区域的能量密度必须为零。段2:...博文来自:wenbu1995的博客

  投资先锋:基金教父的资本市场沉思录(上、下)基本信息作者:(美)约翰.博格[作译者介绍]出版社:机械工业出版社ISBN:74上架时间:2012-5-22出版日期:2012年6月开...博文来自:china-pub网上书店

  多态oc中的指针类型变量有两个:一个是编译时的类型,由声明该变量时使用的类型决定。一个是运行时的类型,由实际赋给该变量的对象决定。如果不一致,就会出现所谓的“多态”。指针变量在编译阶段只能调用其编译时...博文来自:Pudge_____的博客

  策略模式是一种常见的软件设计模式,这里简单得介绍一下策略模式并用IOS简单实现一下。...博文来自:KT的iOS开发小站

  一、概念多态:不同的对象以自己的方式响应消息的能力叫做多态。在ios开发中,每个类都有自己对应的名字空间,这使得多态成为可能,不同类中定义相同的名字并不会冲突,类的实例方法和类方法有如下特点:1、类的...博文来自:ciwei_numberOne的博客

  开始今天的学习课程之前先说几句废话,昨天爬山去了,算是户外运动的入门级别,路线是:香山邮局-好汉坡-打赢哇-猴子爬-水库-八大处,大概行程是12.5KM,历时大概6个小时,不过同行的姑娘们表现也很棒,...博文来自:jeepxiaozi的专栏

  1、什么是多态?    多态就是某一类事物的多种形态。    程序中的多态,不同的对象以自己的方式相应相同名称方法的能力称为多态2、多态的条件:1)、有继承关系,有方法重写              ...博文来自:在路上

  综述多态性是面向对象程序设计的一个重要特征,利用多态性可以设计和实现一个易于扩展的系统。顾名思义,多态的意思是多种形态,在C++程序设计中,多态指的是:具有不同功能的函数可以用同一个函数名,这样可以用...博文来自:feiqiangs的专栏

  一、多态性面向对象的基本思考方式是将数据和处理数据的行为放到一起,降低耦合性。其要点就是不要将数据和处理数据的行为分开在博文来自:圣人男的博客

  在终端用户看来,USB设备为主机提供了多种多样的附加功能,如文件传输,声音播放等,但对USB主机来说,它与所有USB设备的接口都是一致的。一个USB设备由3个功能模块组成:USB总线接口、USB逻辑设...博文来自:知秋一叶

  回复 1# shenlanyouyu 临时想起一些说一下吧:1.分享Linux内核学习和驱动开发的经验。内核学习Linux内核功能越来越完善,如果没有充裕的时间,深入内核并不是很现实。所以建议先读一本...博文来自:one shot,one kill.

  【TechWeb】3月14日消息,今日,在著名物理学家霍金去世一周年之际,霍金遗作《十问:霍金沉思录》中文版正式发布。腾讯董事会主席兼首席执行官马化腾为本书作跋,纪念霍金为科学发展做出的贡献。作为一名...博文来自:weixin_36250534的博客

  帐号相关流程注册范围 企业 政府 媒体 其他组织换句话讲就是不让个人开发者注册。 :)填写企业信息不能使用和之前的公众号账户相同的邮箱,也就是说小程序是和微信公众号一个层级的。填写公司机构信息,对公账...博文来自:小雨同学的技术博客

  一个例子高斯混合模型(Gaussian Mixed Model)指的是多个高斯分布函数的线性组合,理论上GMM可以拟合出任意类型的分布,通常用于解决同一集合下的数据包含多个不同的分布的情况(或者是同一...博文来自:小平子的专栏

  最近比较有空,大四出来实习几个月了,作为实习狗的我,被叫去研究Docker了,汗汗! Docker的三大核心概念:镜像、容器、仓库 镜像:类似虚拟机的镜像、用俗话说就是安装文件。 容器:类似一个轻量...博文来自:我走小路的博客

  一、 关于本篇博文 该文档简单主要描述了如何找出开机各个阶段耗时情况,以及对开机各个阶段的分析方法和如何优化开机时间,减少耗时。便于读者可以通过此文档了解开机时间的各个阶段的耗时情况。 二、开机各阶段...博文来自:一叶梧桐

  0x00前言      HexorBase是一个数据库应用。它是为从一个集中的位置同时管理和审计多个数据库服务器而被设计出来的。它能够执行SQL查询和对常见的数据库服务器暴力破解攻击(MySQL和SQ...博文来自:煜铭2011

  什么是特征选择? 简单说,特征选择就是降维。   特征选择的任务 就是要从n维向量中选取m个特征,把原向量降维成为一个m维向量。但是降维必须保证类别的可分离性或者说分类器的性能下降不多。   注意降维...博文来自:程引的专栏

  Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的Thread...博文来自:u011860731的专栏

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...博文来自:九野的博客

  Cocos2d-x 2.2.3 使用NDK配置编译环境2014年6月11日 Cocos2d-x 3.0以下的开发环境的配置恐怕折磨了很多人,使用cygwin配置编译环境足够让初学者蛋疼一阵子了。本篇博...博文来自:巫山老妖

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...博文来自:Websites

  花了几天,终于把matlab版的人脸检测运行成功了,虽然正确率不是很高,看着各种论文上的人脸检测正确率都出奇的高,我是不怎么相信的,有的论文连基于平均脸的人脸检测正确率都能达到98%,汗啊~~  也许...博文来自:海海人生

  计算广告小窥[中]这孙子怎么什么都知道原作:面包包包包包包 修改:寒小阳 && 龙心尘 时间:2016年2月 出处:博文来自:面包包包包包包的博客

  笔者这段时间测试安卓手机,安卓手机的性能大家都知道了,用的时间长了就是卡,慢,需要刷机,而就算新买来的手机,偶尔滑动也有些卡顿,这次我就自己的测试方法,从开机时间,主页滑动的刷新频率,应用第一次启动速...博文来自:memoryjs的专栏

  0.前言 【1】为什么要使用交叉编译     交叉编译工具较快开发的速度。树莓派中已经安装了gcc工具链,可在树莓派中直接编译源代码生成可执行文件。于此同时,PC机上也可使用gcc工具链生...博文来自:Mars_WH的专栏

  mac装mysql-python有点坑,好在解决了,为了避免类似的问题耽误大家时间,我写下我安装的最终过程: 我选择的brew安装 1、安装brew curl-LsSf博文来自:zhaoteng345的专栏

  在进行自然语言处理、文本分类聚类、推荐系统、舆情分析等研究中,通常需要使用新浪微博的数据作为语料,这篇文章主要介绍如果使用Python和Selenium爬取自定义新浪微博语料。因为网上完整的语料比较少...博文来自:杨秀璋的专栏

  树莓派3 打造定时播报电台音乐闹钟、天气等 参考网址:一、准备工作 1、生气和风天气key...博文来自:wangdamingll的博客

  violetbeen:几何着色器里面,up向量的选择是不是有点不严谨?如果toCamera恰好平行y轴不就会导致叉积为零?

  lv_iron:显示不出来三角形,只有全黑的背景,可能是显卡驱动的问题,大家可以试着更新一下自己的显卡驱动。

本文链接:http://chapmanswifts.com/duotailuoji/289.html