首页 > 代码库 > 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学习笔记十二 多态