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类型的对象就可以传进来了,在调用的时候直接改变参数就可以了.

  多态是面向对象编程的一个重要特征,它大大地增强了软件的灵活性和扩展性.

时间: 2024-09-29 18:01:55

Objective-C学习篇04—多态的相关文章

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

电解电容: 多数在1μF以上,直接用数字表示.如:4.7μF.100μF.220μF等等.这种电容的两极有正负之分,长脚是正极. 独石电容: 独石电容器是多层陶瓷电容器的别称, 简称MLCC 读数方法:把"色环表示法"用到电容上来:这又是一种巧妙的演绎!我们在一些瓷片电容上往往看到这样的标记:"103","104","473"等,这里,第三个数字(个位数字)并非通常理解的个位数,它和四色环电阻的第三环一样,告诉人们前两位数字后

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

今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生,多请OC老鸟来喷~~ 1.OC学习篇之---概述 2.OC学习篇之---第一个程序HelloWorld 3.OC学习篇之---类的定义 4.OC学习篇之---类的初始化方法和点语法的使用 5.OC学习篇之---类的三大特性(封装,继承,多态) 6.OC学习篇之[email protected]关键

Android自定义View学习笔记04

Android自定义View学习笔记04 好长时间没有写相关的博客了,前几周在帮学姐做毕设,所以博客方面有些耽误.过程中写了一个类似wp的磁贴的view,想再写个配套的layout,所以昨天看了一下自定义viewGroup的相关知识-晚上睡觉想了一下可行性不是很高-代码量还不如直接自己在xml上写来得快,速度上也是个问题.今天看了一下张鸿洋老师的Android 自定义View (三) 圆环交替 等待效果这篇博文,再加上前一段时间看到的一幅图,结合之前写的一个圆形imageView的实现博文And

cocos2d-x学习篇之计时器

Cocos2d-x学习篇之简单的时钟 由于C++很菜,在做这个小工具时遇到各种各样蛋疼的问题,甚至准备放弃了,不过,最后还是搞出来了,真尼玛不容易啊. 刚开始想,显示本地时间不是很容易吗,取计算机的当前时间拼接成字符串显示在CCLabelTTF的实例上不就行了吗,几分钟的事,结果整整搞了一天. 首先,cocos2d-x不支持汉字显示,也就是不支持Unicode编码,从网上找了方法来转换一下,如下: #ifndef CHINESE_H #define CHINESE_H #define _GLIB

鸟哥的Linux私房菜——基础学习篇 —— 笔记2

at 语法 == 注意,输入at之后便进入命令行模式 ------- 不管怎么样,只会执行一次. [test @test test]# at [-m] TIME (输入工作指令)[test @test test]# atq (查看当前工作流程)[test @test test]# atrm [jobnumber] (删除流程) -m :执行at规范的工作流程时,将屏幕输出结果mail给输入指令的用户TIME :时间格式,有如下几个: ================== 格式有多种,但没有可以间

Linux新手入门书籍推荐 鸟哥的linux私房菜-基础学习篇

这本书写的不错.赞~\(≧▽≦)/~ 2017-02-24 下午,我开始在Linux下写第一个.c程序,在终端打印hello world.gcc 源代码文件之后,输出可执行文件,但是 当我输入文件名执行它的时候,却提示我 无法找到命令.于是我找百度,查资料,花了半个小时,终于找到解决方法了, 输入"./filename"即可.... 2017-02-25 我看<基础学习篇>这本书,在P158页下面的例题讲解中找到了昨天下午异常的解析.我就很是感慨,心想:要是早看这本书,半个

嵌入式学习_AD学习篇

AD基础使用: 1.建立一个工作区 (.DsnWrk) workspace 2.建立一个PCB工程(.PrjPCB)  project 3.建立一个PCB原理图文件(理论上告诉你两个点连接起来) 建立原理图后需要编译一下,没问题再倒入pcb文件.(.SchDoc)  schemmatic 4.建立一个PCB文件(物理上两个点怎么连)(.PcbDoc) 5.Layout(先布局再布线最后电器规格检查(DRC检查)) 6.生成Gerber文件(G1,G2,GBL,GBO,GBP,GBS,GKO,GP

JAVA学习篇--JSTL基础

JSTL是什么 JSTL(JSP Standard TagLibrary,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库. 为什么要用JSTL 我们JSP用于开发信息展现页非常方便;也可以嵌入java代码(scriptlet.表达式和声明)代码用来实现相关逻辑控制.看下面程序.但这样做会带来如下问题: jsp维护难度增加;出错提示不明确,不容易调试; 分工不明确;(即jsp开发者是美工,也是程序员); 最终增加程序的开发成本; <% if (session.getAttribute(

OC学习篇之---单例模式

在之前的一片文章中介绍了对象的拷贝相关知识:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天我们来看一下OC中的单例模式,单例模式在设计模式中用的可能是最多的一种了,而且也是最简单的一种 实现单例模式有三个条件 1.类的构造方法是私有的 2.类提供一个类方法用于产生对象 3.类中有一个私有的自己对象 针对于这三个条件,OC中都是可以做到的 1.类的构造方法是私有的 我们只需要重写allocWithZone方法,