——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一.多态概念
多态的前提,必须存在继承关系,在代码中的表现形式就是父类类型保存子类类型,即父类的指针指向子类对象。
二.多态特性
在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 ;
}