多态

  多态的概念

   有这样一个例子.早上我和同事说口渴了.结果: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. Hibernate -- 注解(Annotation)关系映射

    转自:http://www.cnblogs.com/tyler2000/archive/2011/01/20/1940354.html 1. Hibernate Annotation关系映射有下面几种 ...

  2. Android Task 相关

    在日常开发过程中,只要涉及到activity,那么对task相关的东西总会或多或少的接触到,不过对task相关的一些配置的作用一直理解的还不是很透彻,官方文档在细节上说的也不够清楚,要透彻理解还是得自 ...

  3. autotrace显示Statistics很多信息为0(转)

    一朋友使用autotrace查看数据库执行计划发现结果如下,Statistics中很多信息为0,这个肯定是不正常现象,什么都可以为0,consistent gets也不可能为0. SQL> se ...

  4. 2015 BJOI 0102 Secret

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=477 试题描述: 在 MagicLand 这片神奇的大陆上,有样一个古老传说 ...

  5. Android数据加密解密

    最近项目在维护过程中,估计这一周都会没有什么事情做了.于是开始打量自己做完的这个项目,项目在展示方面乏善可陈,然后仔细的想了想,这个项目的亮点无非就在数据加密和解密这一块了.因为是银行的项目,所以对数 ...

  6. 【模拟】Codeforces 711A Bus to Udayland

    题目链接: http://codeforces.com/problemset/problem/711/A 题目大意: N个字符串,每个字符串5位,找到第一个出现两个OO的并改成++输出YES和改后字符 ...

  7. 【动态规划】Vijos P1121 马拦过河卒

    题目链接: https://vijos.org/p/1616 题目大意: 卒从(0,0)走到(n,m),只能向下或向右,不能被马一步碰到或走到马,有几种走法. 题目思路: [动态规划] 把马控制的地方 ...

  8. WebView js 调用Java本地方法

    webView = (WebView) this.findViewById(R.id.webview); WebSettings webSettings = webView.getSettings() ...

  9. [Hibernate] 基本增删查改

    本文记录,Java 应用通过 Hibernate 对数据库 MySQL 进行基本的增删改查操作,即CRUD. 本例子的目录结构如下 hibernate.cfg.xml 存储数据库信息,如数据库类型,账 ...

  10. 《算法问题实战策略》-chaper8-动态规划法

    Q1:偶尔在电视上看到一些被称为“神童”的孩子们背诵小数点以后几万位的圆周率.背诵这么长的数字,可利用分割数字的方法.我们用这种方法将数字按照位数不等的大小分割后再背诵. 分割形式如下: 所有数字都相 ...