OC面向对象—多态

一、基本概念

多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态。

在使用多态是,会进行动态检测,以调用真实的对象方法。

多态在代码中的体现即父类指针指向子类对象。

Animal类的声明

Animal类的实现

Dog类继承自Animal类

Dog类的实现

测试程序:

二、使用注意

代码分析:

Dog *d=[[Animal  alloc] init];   动物是一条狗?语义正确吗?

NSString *str=[Dog  new];     狗是一个字符串?正确吗?

Oc语言是一门弱语法的语言,编译的时候并不会报错,所以这就要求我们在实际的开发过程中一定要按照既定的规范来写代码,不要出现狗是一个字符串这样的问题。

多态的好处:

需要一个新的函数专门用来喂狗

Void feed(Dog *d)

{

[d  eat];

}

如果这个时候也需要喂猫,那就应该重写新一个新的函数

Void feed(Cat *c)

{

[c  eat];

}

而狗和猫实际上都继承自动物这个类,在这里就可以使用多态来简化代码了。

这里只需要把函数的参数写成是Animal *类型的,那么Dog和Cat类型的对象就都可以传入进来。

调用的时候直接改变参数就可以了。

多态的局限性:父类类型的指针变量不能直接调用子类特有的方法。

不建议的做法~

Animal *a=[[Dog alloc] init];

[a run];//在Animal类中没有run方法,这里调用了狗对象的方法。

解决方法:可以将a强制转换为Dog*类型的变量,如下:

Dog *d=(Dog *)a;//使用强制转换,这里a和d指向的是同一个狗对象

三、多态使用总结

(1)没有继承就没有多态

(2)代码的体现:父类类型的指针指向子类对象

(3)好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了。

(4)局限性:父类类型的变量不能直接调用子类特有的方法,如果必须要调用,则必须强制转换为子类特有的方法。

四、字符串补充内容

@“234”字符串也是一个对象,属于NSString这个类。下面是对字符串对象的一些代码说明:

字符串对象的length方法:计算的是字符串的字数,而不是像strlen函数那样,计算的是字符数。如“哈ha123”length得出的结果是6,返回unsigned long类型,而strlen函数得出的结果是8,因为一个汉字占3个字节。

提示:字数也包括空格。

李洪强iOS开发之OC面向对象—多态的更多相关文章

  1. 李洪强iOS开发之OC[018]对象和方法之间的关系

    // //  main.m //  18 - 对象和方法之间的关系 // //  Created by vic fan on 16/7/14. //  Copyright © 2016年 李洪强. A ...

  2. 李洪强iOS开发之OC常见错误汇总

    // //  main.m //  16 - 常见错误汇总 // //  Created by vic fan on 16/7/13. //  Copyright © 2016年 李洪强. All r ...

  3. 李洪强iOS开发之OC[014] -对象的存储细节

    // //  main.m //  13 - 对象的存储细节 // //  Created by vic fan on 16/7/9. //  Copyright © 2016年 李洪强. All r ...

  4. 李洪强iOS开发之OC[013] -类的创建的练习

    // //  main.m //  12 - 类的创建练习 // //  Created by vic fan on 16/7/9. //  Copyright © 2016年 李洪强. All ri ...

  5. 李洪强iOS开发之OC[008] -创建一个对象并访问实例变量

    // //  main.m //  07 - 创建一个对象并且访问实例变量 // //  Created by vic fan on 16/7/3. //  Copyright © 2016年 李洪强 ...

  6. 李洪强iOS开发之OC[010] - 有参方法的声明实现和调用

    // //  main.m //  09 - 有参方法的声明实现和调用 // //  Created by vic fan on 16/7/5. //  Copyright © 2016年 李洪强. ...

  7. 李洪强iOS开发之OC[017]函数和方法的区别

    // //  main.m //  15 - 函数和对象的方法的区别 // //  Created by vic fan on 16/7/12. //  Copyright © 2016年 李洪强. ...

  8. 李洪强iOS开发之OC[015]#pragma mark的使用

    // //  main.m //  14 - #pragma mark的使用 // //  Created by vic fan on 16/7/10. //  Copyright © 2016年 李 ...

  9. 李洪强iOS开发之OC[012] -类的声明实现小结

    // //  main.m //  11 - 内容总结 // //  Created by vic fan on 16/7/9. //  Copyright © 2016年 李洪强. All righ ...

随机推荐

  1. 【EF Code First】 一对多、多对多的多重关系配置

    这里使用用户表(User)和项目(Project)表做示例 有这样一个需求: 用户与项目的关系是:一个用户可以发多个项目,可以参加多个项目,而项目可以有多个参与成员和一个发布者 [其中含1-n和n-n ...

  2. IOS内存管理「4」- ARC 和垃圾回收机制的基本概念

  3. 条款24:若所有的函数参数可能都需要发生类型转换才能使用,请采用non-member函数

    假设有一个有理数类Rational,有一个计算有理数乘法的成员函数operator*,示例如下: #include <iostream> class Rational { public: ...

  4. 【转载】FPGA静态时序分析——IO口时序

    转自:http://www.cnblogs.com/linjie-swust/archive/2012/03/01/FPGA.html 1.1  概述 在高速系统中FPGA时序约束不止包括内部时钟约束 ...

  5. Java 集合转换(数组、List、Set、Map相互转换)

    转自:http://blog.csdn.net/top_code/article/details/10552827 package com.example.test; import java.util ...

  6. datawindow直接导入导出xml

    long dwcontrol.ImportFile ( XML!, filename ) dw_.Modify("DataWindow.Export.XML.UseTemplate = 't ...

  7. Indigo Studio

    http://www.infragistics.com/products/indigo-studio?gclid=CIXrnav4lcQCFdclvQoduVEAnA

  8. ionic:Build mobile apps faster with the web technologies you know and love

    http://ionicframework.com/getting-started/ 5 Ionic Framework App Development Tips and Tricks http:// ...

  9. MSSQL Transaction[事务] and Procedure[存储过程]

    --事务分三种 --1.显示事务 --我们手动begin transaction ...... commit transaction/rollback transaction --上面这种写法叫做“显 ...

  10. 0x0A和0x0D

    这里主要是在windows下面做的小实验,linux没有试 先贴源码 #include <iostream> #include <string> #include <st ...