多态

  多态的概念

   有这样一个例子.早上我和同事说口渴了.结果: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—多态的更多相关文章

  1. 【从零开始自制CPU之学习篇04】电容

    电解电容: 多数在1μF以上,直接用数字表示.如:4.7μF.100μF.220μF等等.这种电容的两极有正负之分,长脚是正极. 独石电容: 独石电容器是多层陶瓷电容器的别称, 简称MLCC 读数方法 ...

  2. iOS系列 基础篇 04 探究视图生命周期

    iOS系列 基础篇 04 探究视图生命周期 视图是应用的一个重要的组成部份,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻. 以视图的四种状态为基础,我们来系统了解一下视 ...

  3. 机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes)

    机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes) 关键字:朴素贝叶斯.python.源码解析作者:米仓山下时间:2018-10-2 ...

  4. OC学习篇之---总结和学习目录

    今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生 ...

  5. js学习篇1--数组

    javascript的数组可以包含各种类型的数据. 1. 数组的长度 ,直接用 length 属性; var arr=[1,2,3]; arr.length; js中,直接给数组的length赋值是会 ...

  6. Tomcat集群配置学习篇-----分布式应用

    Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问 ...

  7. (转载)OC学习篇之---概述

    前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲 ...

  8. 《Mysql 公司职员学习篇》 第二章 小A的惊喜

          第二章 小A的惊喜  ---- 认识数据库 吃完饭后,小Y和小A回到了家里,并打开电脑开始学习Mysql. 小Y:"小A,你平时的Excell文件很多的情况下,怎么样存放Exce ...

  9. Angularjs学习---ubuntu12.04中karma安装配置

    Angularjs学习---ubuntu12.04中karma安装配置中常见的问题总结   karma启动时出现了很多问题: 1.安装karma前提条件 安装karma首先要安装nodejs,npm然 ...

随机推荐

  1. SQLPLUS使用

    1.CMD命令 2.输入SQLPLUS 3.如果oracle服务器中装有多个数据库实例,则在用户名处输入:用户名/密码@数据库名称.如果数据库服务器不在本机上,还需要加上数据库服务器的地址:用户名/密 ...

  2. jQuery Asynchronous

    http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html http:// ...

  3. Ugly Windows

    poj3923:http://poj.org/problem?id=3923 题意:给出两个整数n.m表示屏幕的长宽.屏幕上有一些窗口,每个窗口都是矩形的,窗口的边框用同一个大写字母来表示,不同的窗口 ...

  4. 轮值CEO胡厚崑:到2025年所有的企业都将用到云(云的2.0时代,会有几千朵云几万朵云升起来,这将产生不同的技术模式、商业模式、思维模式)

    2016年09月04日 07:38 中国经营报   李凡 在全国工商联“2016年中国民营企业500强”排行榜上夺得头把交椅的华为,向外界描绘了面向未来进一步做大做强的路径. 华为创始人任正非于201 ...

  5. 15.禁用ViewState

    默认情况下ASP.net是启用ViewState的,这样在页面中会生成冗长的隐藏字段,ViewState对于需要PostBack处理的页面才可能有用,对于不需要交互的页面则完全没有必要用ViewSta ...

  6. Function语义学之member function

    之前我们讲过编译器会对 nonmember functions 进行怎样的扩充和该写,今天我们来讲一下 member functions 函数调用方式 一.Nonstatic Member Funct ...

  7. 实战weblogic集群之应用部署

    一.创建应用发布目录,上传应用包. 1.在10.70.52.11-14的/app/sinova目录下建立applications目录(名称可以自定义),作为我们应用的发布目录. $ mkdir /ap ...

  8. Codeforces 716A Crazy Computer 【模拟】 (Codeforces Round #372 (Div. 2))

    A. Crazy Computer time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  9. poj 2187 凸包加旋转卡壳算法

    题目链接:http://poj.org/problem?id=2187 旋转卡壳算法:http://www.cppblog.com/staryjy/archive/2009/11/19/101412. ...

  10. Websphere内存溢出的日志

    项目中碰到Websphere内存溢出的情况.原因可能:出现过多内存泄漏,或者分配过多大内存等.解决方法:1.进入was管理控制台,选择 应用程序服务器 > server1 > 进程定义 & ...