首页 > 代码库 > OC学习笔记十二 多态
OC学习笔记十二 多态
一.多态概念
多态的前提,必须存在继承关系,在代码中的表现形式就是父类类型保存子类类型,即父类的指针指向子类对象。
二.多态特性
在OC中,调用方法是,会检测对象的真实类型,称为动态绑定。
父类保存子类指针,在调用方法时,有以下步骤:
1).在编译的时候,会检查 父类指向子类的指针 调用的方法,在父类中是否存在,如果有,编译通过
2).在运行时,会动态检测 初始对象 的真实类型
三.多态用途
提供动态绑定特性,减少不必要的程序冗余。在方法中,把父类当成参数,使该方法具备调用所有子类同样方法的能力
四.多态好处
多态的出现提高了程序的扩展性和后期可维护型.
五.多态局限性
如果子类中有父类没有的方法,通过父类的指针调用该方法时,需要进行强制类型转换。否则会报错。
强类型转换方式:
Cat *cat =(Cat *) animal;
六.代码
动物类:Animal 具有 eat 方法
子类:Cat类 Dog类,都继承父类的eat 方法,并重载
饲养员类:Breeder 具有 饲养cat dog 的方法。
1.animal 父类
===Animal.h=== @interface Animal : NSObject -(void)eat; @end
2.dog cat子类
===Cat=== @interface Cat : Animal @end @implementation Cat -(void)eat { NSLog(@"Cat eat .."); } @end ===Dog=== @interface Dog : Animal @end @implementation Dog -(void)eat { NSLog(@"Dog eat ..."); } @end
3.饲养员类
===Breeder.h=== @interface Breeder : NSObject //非多态 -(void)breedCat:(Cat *)cat; -(void)breedDog:(Dog *)dog; //多态 -(void)breed:(Animal *)animal; @end ===Breeder.m=== @implementation Breeder //饲养 Cat -(void)breedCat:(Cat *)cat { [cat eat]; } //饲养 Dog -(void)breedDog:(Dog *)dog { [dog eat]; } /* 多态调用:把父类当成参数,使该方法具备调用所有子类同样方法的能力 多态好处:减少了冗余,不比为每个动物都写个方法 */ -(void)breed:(Animal *)animal { [animal eat]; } @end
4.主函数
int main(int argc, const char * argv[]) { @autoreleasepool { //模拟饲养员饲养动物 Breeder *breeder = [[Breeder alloc]init]; NSLog(@"======非多态调用 ======"); //需要为每个动物写个方法,调用对象的饲养动物方法 Cat *cat = [[Cat alloc]init]; [breeder breedCat:cat]; Dog *dog = [[Dog alloc]init]; [breeder breedDog:dog]; NSLog(@"======多态调用 ======"); //不比为每个动物提供具体方法,减少冗余 //声明父类来接收子类的指针 Animal *c = [[Cat alloc]init]; Animal *d = [[Dog alloc]init]; [breeder breed:c]; [breeder breed:d]; //也可以直接把子类当成参数 [breeder breed:cat]; [breeder breed:dog]; } return 0; } 输出: 2014-10-16 22:58:13.788 继承和多态[2938:303] ======非多态调用 ====== 2014-10-16 22:58:13.789 继承和多态[2938:303] Cat eat .. 2014-10-16 22:58:13.790 继承和多态[2938:303] Dog eat ... 2014-10-16 22:58:13.790 继承和多态[2938:303] ======多态调用 ====== 2014-10-16 22:58:13.790 继承和多态[2938:303] Cat eat .. 2014-10-16 22:58:13.790 继承和多态[2938:303] Dog eat ... 2014-10-16 22:58:13.791 继承和多态[2938:303] Cat eat .. 2014-10-16 22:58:13.791 继承和多态[2938:303] Dog eat ...
OC学习笔记十二 多态
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。