天天看点

黑马程序员-OC学习日记五之多态

——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 ;
}