标签:style io os ar sp 2014 on log 代码
多态的前提,必须存在继承关系,在代码中的表现形式就是父类类型保存子类类型,即父类的指针指向子类对象。
在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 ...
标签:style io os ar sp 2014 on log 代码
原文地址:http://my.oschina.net/u/1032974/blog/333039