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然 ...
随机推荐
- tortoisegit安装使用
git的使用越来越广泛 使用命令比较麻烦,下面讲解一下tortoisegit的使用 先下载安装git(msysgit)和tortoisegit,安装后提示重启电脑,不解释 1.找一个文件夹做仓库 这里 ...
- javascript类型系统之Array
原文:javascript类型系统之Array 目录 [1]数组创建 [2]数组操作 [3]继承的方法 [4]实例方法 数组转换 数组检测 栈和队列 排序方法 操作方法 位置方法 前面的话 数组是一组 ...
- 两个div之间有空隙
加句*{ margin:0; padding:0;} 最近在做网页时发现,在IE7下(FF没试过),div与div之间有时会出20个像素左右的空隙,除非把margin设成负值,否则空隙无法去除.我在 ...
- struts2之防止表单重复提交
struts.xml配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...
- Hibernate 配置详解(2)
6) hibernate.session_factory_name: 配置一个JNDI名称,通过Configuration对象创建的SessionFactory会绑定到JNDI下该名称中.一般名字格式 ...
- Entropy (huffman) 优先队列)
http://acm.hdu.edu.cn/showproblem.php?pid=1053 Huffman问题利用STL中的priority_queue解决: #include<stdio.h ...
- 开源代码搜索器searchcode
项目主页:https://searchcode.com/ 查看API:https://searchcode.com/api/ 关于:https://searchcode.com/about/ Sear ...
- 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)
HDU 1565 方格取数(1) 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的 ...
- IE JavaScript字符串转换成Date后出现NaN错误
参考的博文:http://blog.csdn.net/zhu7478848/article/details/53388582 在IE浏览器下, JavaScript字符串转换成Date后会出现NaN错 ...
- SimpleDateFormat线程不安全问题处理
在工作中,通过SimpleDateFormat将字符串类型转为日期类型时,发现有时返回的日期类型出错,调用方法如下: public final class DateUtil { static fina ...