一起Talk IOS吧(第二十回 OC中的多态)

2024-03-12 03:48

本文主要是介绍一起Talk IOS吧(第二十回 OC中的多态),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

看官们,本章回中介绍面向对象中第三个主要内容:多态。

多态表示不同类型的对象收到相同的消息时表现出不同的效果。举一个常见的例子:天气预报说明天会下雪,农民们听到这个消息后很高兴,因为下雪有助于农作物生长;物流公司听到这个消息后就不高兴了,因为下雪影响物流运输。同样的消息到了不同人哪里引起了不同的效果,这便是多态。

多态比较抽象,只从文字上说明不好理解,接下来我们通过具体的代码来演示什么是多态。

[phone makeCall];  输出结果:Phone makeCall
[iPhone makeCall]; 输出结果:IPhone makeCall

这是我们从上一章回中拿出的部分代码,大家可以看到收到makeCall这个消息后两种不同类型的对象输出了不同的结果。这便是多态。

有看官说,不同类型的对象输出不同的结果,这个是正常的。这么说也对,这段代码理解起来比较容易,不过你可不要把多态想简单了,面向对象三个要素中多态最复杂。接下来我们展示一个有难度的代码:

Phone * temp = nil;if([iPhone isKindOfClass:[Phone class]]) {temp = (Phone*)iPhone;[temp makeCall];
}else {NSLog(@"IPhone is not isKindsOfClass: Phone");
}

我们一起分析上面的代码,因为多态是建立在继承的基础上的,所以我们复用了上一章回的代码,只需要把上面的代码复制到上一章回中代码的main方法最后面就可以运行。

代码中定义了一个Phone类型的对象指针temp,并且初始化为空,然后把IPhone类型的对象强制转换成成Phone类型的对象并且赋值给temp,temp收到makeCall消息后输出什么结果呢?

小部分看官说:IPhone makeCall。大部分看官说:Phone makeCall。看来大家有分歧。我来告诉大家答案是:IPhone makeCall。

看来真理还是掌握在少数人手里呀。这里的原因是什么呢?我们这就给大家分析,temp虽然是Phone类型的对象,但是它真正的内容是IPhone对象的内容,因为它是从IPone对象转换来的。这可以看作是一种隐形的多态。

这里面涉及到了类型转换。子类对象可以转换成父类对象, 但是父类对象不能直接转换成子类对象,如果想让父类对象转换成子类对象,需要符合一定的前提条件:父类对象是通过子类的对象转换而来的,比如我们上面的代码就是一个例子。子类对象转换成父类对象后就可以通过父类对象访问子类中的方法,或者说相同的消息传递给子类对象对象和父类对象后会产生不同的效果,这也符合多态的思想。

最后,我们对本章回的内容做一个总结:

  • 1.多态表示不同对象收到相同消息时展示不同的形态;
  • 2.子类对象可以转换成父类对象,父类对象不能直接转换成子类对象;
  • 3.可以使用父类对象调用子类的方法,当然需要一定的前提条件:父类对象通过子类对象转换而来;

看官们,欲知后事如何且听下回分解!

这篇关于一起Talk IOS吧(第二十回 OC中的多态)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/800056

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

跟我一起玩《linux内核设计的艺术》第1章(四)——from setup.s to head.s,这回一定让main滚出来!(已解封)

看到书上1.3的大标题,以为马上就要见着main了,其实啊,还早着呢,光看setup.s和head.s的代码量就知道,跟bootsect.s没有可比性,真多……这确实需要包括我在内的大家多一些耐心,相信见着main后,大家的信心和干劲会上一个台阶,加油! 既然上篇已经玩转gdb,接下来的讲解肯定是边调试边分析书上的内容,纯理论讲解其实我并不在行。 setup.s: 目标:争取把setup.

iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)

摘要 剪贴板同步能够提高很多的效率,免去复制、发送、复制、粘贴的步骤,只需要在手机上复制,就可以直接在电脑上 ctrl+v 粘贴,这方面在 Apple 设备中是做的非常好的,Apple 设备之间的剪贴板同步功能(Universal Clipboard)确实非常方便,它可以在 iPhone、iPad 和 Mac 之间无缝传输剪贴板内容,从而大大提高工作效率。 但是,iPhone 如何和 Wind

【JVM】JVM栈帧中的动态链接 与 Java的面向对象特性--多态

栈帧 每一次方法调用都会有一个对应的栈帧被压入栈(虚拟机栈)中,每一个方法调用结束后,都会有一个栈帧被弹出。 每个栈帧中包括:局部变量表、操作数栈、动态链接、方法返回地址。 JavaGuide:Java内存区域详解(重点) 动态链接 动态链接:指向运行时常量池中该栈帧所属方法的引用。 多态 多态允许不同类的对象对同一消息做出响应,但表现出不同的行为(即方法的多样性)。 多态

iOS项目发布提交出现invalid code signing entitlements错误。

1、进入开发者账号,选择App IDs,找到自己项目对应的AppId,点击进去编辑, 2、看下错误提示出现  --Specifically, value "CVYZ6723728.*" for key "com.apple.developer.ubiquity-container-identifiers" in XX is not supported.-- 这样的错误提示 将ubiquity

我的第一次份实习工作-iOS实习生-第三个月

第三个月 这个月有一个考核项目,是一个电子书阅读器,组长说很重要,是我的实习考核项目。 我的项目XTReader,这是我参考网上的一些代码,和模仿咪咕阅读做的,功能还不完善,数据的部分是用聚合数据做的。要收费的。   还有阅读页面,基本功能实现了一下。使用了autolayout,自适应布局,也是第一次用网络,第一次用数据库,第一次用自动布局。还有很多不足。 做了一周多,有个问题一直没

我的第一次份实习工作-iOS实习生-公司使用过的软件

bittorrentsync 素材,文件同步软件 cornerstone svn 软件开发合作 mark man 测量坐标的软件 SQLLite Manager 数据库操作软件

我的第一次份实习工作-iOS实习生-第二个月

第二个月 来公司过了一个月了。每天早上9点上班,到晚上6.30下班,上下班要指纹打卡,第一个月忘了打卡好多次(),然后还要去补打卡单。公司这边还安排了,工资卡办理,招商银行卡。开了一次新员工大会,认识了公司的一些过往,公司的要求等,还加了一下公司的企业QQ,还有其他的羽毛球群,篮球群。我加了下羽毛球群,也去打了一两次。第二个月的感受,感觉跟组里面的交流跟沟通都好少,基本上还有好多人不认识。想想也