多态

  多态的概念

   有这样一个例子.早上我和同事说口渴了.结果: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. js 外部文件加载处理

    概述 前端在日常工作中很大一部分时间是在思考页面的优化方案,让页面载入得更快.鉴于javascript是单线程的事件驱动语言,优化工作之一就是:控制图片.swf.iframe等大流量文件以及js和cs ...

  2. Bug in Code

    Coder-Strike 2014 - Finals (online edition, Div. 1) C:http://codeforces.com/problemset/problem/420/C ...

  3. Blue Jeans

    Description The Genographic Project is a research partnership between IBM and The National Geographi ...

  4. POJ 2289 Jamie's Contact Groups(多重匹配+二分)

    题意: Jamie有很多联系人,但是很不方便管理,他想把这些联系人分成组,已知这些联系人可以被分到哪个组中去,而且要求每个组的联系人上限最小,即有一整数k,使每个组的联系人数都不大于k,问这个k最小是 ...

  5. 图论(网络流):SPOJ OPTM - Optimal Marks

    OPTM - Optimal Marks You are given an undirected graph G(V, E). Each vertex has a mark which is an i ...

  6. 数据结构(RMQ):POJ 3624 Balanced Lineup

    Balanced Lineup   Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always li ...

  7. Codeforces 715B & 716D Complete The Graph 【最短路】 (Codeforces Round #372 (Div. 2))

    B. Complete The Graph time limit per test 4 seconds memory limit per test 256 megabytes input standa ...

  8. [FreeProxy]FreeProxy代理服务器端软件介绍 之 sock 5

    首先在FreeProxy上创建一个sock5 service 然后在Client 设置使用sock5

  9. 动态规划——C编辑最短距离

    C - 编辑距离 时间限制: 1000女士 内存限制: 65536KB 64位输入输出格式: %I64d & %I64u 提交 状态 描述 Let x and y be two strings ...

  10. MyEclipse里项目部署到tomcat上之后,tomcat webpps文件夹里为什么找不到这个项目

         今天在MyEclipse中部署了一个java web项目,然后发现报404错误,跑到tomcat目录下的webapps文件夹里并发现没有这个项目,才发现MyEclipse没有写入webapp ...