Objective-C学习篇04—多态
多态
多态的概念
有这样一个例子.早上我和同事说口渴了.结果:A同事拿着我的水杯去给我接了一杯水.B同事顺手在饮水机上拿了一次性纸杯给我接了杯水。C同事给了我一瓶他早上刚买的饮料。同事们得到的是同样的请求,但是三个人都有各自的解决办法,这就是多态。
在面向对象的程序设计理论中,多态(polymer phism)指的是,同一操作作用于不同类的实例时,将产生不同的执行效果.即不同类的对象收到相同的消息时,也能得到不同的结果.
我们知道,OC是一门动态语言,在使用多态时,系统会进行动态检测,以调用真实的对象方法. 在具有继承关系的前提下,多态在代码中体现为父类指针指向子类对象.
实现:
首先创建一个Animal类,让其继承自NSObject
Animal.h
@interface Animal : NSObject // 声明动物吃东西的方法 - (void)eat; @end
Animal.m
@implementation Animal - (void)eat {
NSLog(@"动物吃东西"); } @end
再创建一个一个Cat类和Dog类,分别重写自己独有的方法.
Cat 类
Cat.h // Cat继承自Animal类
@interface Cat : Animal @end
Cat.m
@implementation Cat
// 重写猫独有的方法- (void)eat { NSLog(@"猫吃鱼");
} @end
Dog类
Dog.h // Dog继承自Animal类,拥有了Animal所有的属性和方法@interface Dog : Animal @end
Dog.m
@implementation Dog
// 重写狗独有的方法- (void)eat { NSLog(@"狗吃骨头"); } @end
回到main中实现:
// 创建animal对象
Animal *animal = [[Animal alloc] init];
// 多态的实现:
//1. 父类指针指向子类对象
animal = [[Cat alloc] init];
// 此时调用的方法到底是 动物吃东西呢? 还是猫吃东西呢?
[animal eat];
//2.
animal = [[Dog alloc] init];
[animal eat];
打印:
2015-11-27 17:31:38.975 DuoTai[1597:251835] 猫吃鱼
2015-11-27 17:31:38.975 DuoTai[1597:251835] 狗吃骨头
下面,我们再来看这样两行代码:
Dog *dog = [[Animal alloc] init]; // 动物是一条狗?这样的逻辑正确吗??
NSString *string = [[Dog alloc] init]; // 狗是一个字符串??
由上面发现:
OC语言是一门弱语法的语言,编译的时候并不会报错,系统只会发出警告.所以这就要求我们在实际的开发过程中一定要按照既定的规范来写代码。
多态的局限
父类指针不能直接调用子类独有的方法,虽然可以调用成功,但是这样写是不规范的
Animal *animal2 = [[Cat alloc] init];
[animal2 eat];
// [animal2 catchMouth];
多态的好处:
女孩一般比较喜欢养宠物,现在创建一个女孩类,让她拥有养宠物的方法
Girl.h
@class Animal; // 在Girl.h中用@class引入 Animal的头文件,告诉编译器后面的是一个类 @interface Girl : NSObject - (void)feedAnimal:(Animal *)animal; @end
Girl.m
#import "Animal.h" // 在Girl.m中用#import引入Animal的头文件
@implementation Girl
- (void)feedAnimal:(Animal *)animal {
NSLog(@"女孩饲养宠物%@", animal);
}
@end
main.m
// 创建一个女孩对象
Girl *girl = [[Girl alloc] init];
// 前男友送了它一只猫cat,她需要饲养
Cat *cat = [[Cat alloc] init];
// 女孩对象调用饲养动物的方法,将猫传进去
[girl feedAnimal:cat];
// 现在,前男友把甩了,认识了新男友,新男友送了一只狗够给她,她也需要饲养
Dog *d = [[Dog alloc] init];
// 女孩对象调用饲养动物的方法,将狗传进去
[girl feedAnimal:d];
// 打印结果
2015-11-27 22:02:22.887 DuoTai[1812:401072] 女孩饲养宠物<Cat: 0x100206410>
2015-11-27 22:02:22.887 DuoTai[1812:401072] 女孩饲养宠物<Dog: 0x1003006c0>
多态的优点
猫和狗都是继承自Animal这个类,在这里我们就可以使用多态来简化代码了,只需要把函数的参数写成Animal * 类型的,那么Dog 和Cat类型的对象就可以传进来了,在调用的时候直接改变参数就可以了.
多态是面向对象编程的一个重要特征,它大大地增强了软件的灵活性和扩展性.
Objective-C学习篇04—多态的更多相关文章
- 【从零开始自制CPU之学习篇04】电容
电解电容: 多数在1μF以上,直接用数字表示.如:4.7μF.100μF.220μF等等.这种电容的两极有正负之分,长脚是正极. 独石电容: 独石电容器是多层陶瓷电容器的别称, 简称MLCC 读数方法 ...
- iOS系列 基础篇 04 探究视图生命周期
iOS系列 基础篇 04 探究视图生命周期 视图是应用的一个重要的组成部份,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻. 以视图的四种状态为基础,我们来系统了解一下视 ...
- 机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes)
机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes) 关键字:朴素贝叶斯.python.源码解析作者:米仓山下时间:2018-10-2 ...
- OC学习篇之---总结和学习目录
今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生 ...
- js学习篇1--数组
javascript的数组可以包含各种类型的数据. 1. 数组的长度 ,直接用 length 属性; var arr=[1,2,3]; arr.length; js中,直接给数组的length赋值是会 ...
- Tomcat集群配置学习篇-----分布式应用
Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问 ...
- (转载)OC学习篇之---概述
前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲 ...
- 《Mysql 公司职员学习篇》 第二章 小A的惊喜
第二章 小A的惊喜 ---- 认识数据库 吃完饭后,小Y和小A回到了家里,并打开电脑开始学习Mysql. 小Y:"小A,你平时的Excell文件很多的情况下,怎么样存放Exce ...
- Angularjs学习---ubuntu12.04中karma安装配置
Angularjs学习---ubuntu12.04中karma安装配置中常见的问题总结 karma启动时出现了很多问题: 1.安装karma前提条件 安装karma首先要安装nodejs,npm然 ...
随机推荐
- java 线程基本概念 可见性 同步
开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于J ...
- Effective C++学习笔记:初始化列表中成员列出的顺序和它们在类中声明的顺序相同
类成员的默认初始化顺序是按照声明顺序进行, 如果使用初始化列表初始化成员变量, 则必须按照成员变量的声明顺序进行; 否则, 在变量之间交替赋值时, 会产生, 未初始化的变量去赋值其他变量; 同时GCC ...
- Linux目录树
Linux目录树(directory tree) 分层结构(不同于数据库文件系统),单个文件/目录的最大长度为255个字符,完整路径为4096个字符 特殊的文件系统 文件系统 挂载点 说明 Root ...
- JFS与JFS2的区别
请问一下JFS与JFS2的区别? 支持最大的文件? 普通JFS:2G:支持大文件JFS:64G:JFS2:1T 支持最大的文件系统?普通JFS,支持大文件JFS,JFS2分别是多大呢? The max ...
- joelonsoftware 读书摘录
joelonsoftware 读书摘录 <五个为什么> 1.“黑天鹅难题”,代表外来因素,是一个超出正常预料之外的事件. 2.丰田佐吉的“五个为什么”,当某个地方出现问题时,你就一 ...
- Ubuntu下安装Skyeye
ubuntu12下安装skyeye1.3.2 1.首先安装skyeye的依赖包,比如gtk的依赖,一般Ubuntu 都默认安装了,稳妥起见,运行下面的代码: sudo apt-get install ...
- KMP算法,Boyer-Moore算法
http://www-igm.univ-mlv.fr/~lecroq/string/node19.html 首先看普通的串的模式匹配算法开始讲起,才能更深入的了解KMP算法及其优点. 1. 普通的串的 ...
- The Minimum Length - HUST 1010(求最小循环节)
题意:有个一字符串A(本身不是循环串),然后经过很多次自增变成AAAAA,然后呢从自增串里面切出来一部分串B,用这个串B求出来A的长度. 分析:其实就是求最小循环节.......串的长度 - 最大 ...
- apache POI 导出excel相关方法
apache POI 操作excel无比强大.同时有操作word和ppt的接口. 下面讲解poi中常用方法. 1,设置列宽 HSSFSheet sheet = wb.getSheetAt(0); sh ...
- 网络编程之TCP异步群聊:客户端代码
最近朋友建议我写一些关于微软云技术的博客留给学校下一届的学生们看,怕下一届的MSTC断档.于是我也觉的有这个必要.写了几篇博客之后,我觉得也有必要把这一年的学习内容放在博客做个纪念,就这样写了本篇博客 ...