首页 > 代码库 > 黑马程序员—15-oc多态

黑马程序员—15-oc多态

 
 

一、    多态概念

u 父类指针指向子类对象(条件,必须得有继承)

u 局限性:父类指针不能调用子类的方法

u 好处:如果我们这个函数\方法中使用的是父类类型,可以传入父类之类对象

二、   多态的基本使用

#import <Foundation/Foundation.h>

 

//Animal的声明

@interface Animal : NSObject

//定义一个eat对象方法

- (void)run;

@end

 

@implementation Animal

- (void)run

{

    NSLog(@"动物跑两圈");

}                               

@end

 

//Dog类,继承了Animal

@interface Dog :Animal

- (void)run;

@end

 

@implementation Dog

- (void)run

{

    NSLog(@"狗跑两圈");

}

@end

 

int main()

{

       //创建子类Dog对象

    Dog *d = [Dognew];

    [d  run];

   

    //这里父类的指针指向子类的对象

    Animal *a =[Dog new];

    [a run];

 

    //创建父类Animal对象

    Animal *a1 =[Animal new];

    [a1 run];

}

输出结果:狗跑两圈

          狗跑两圈

          动物跑两圈

上面例子中父类调用子类的对象方法也是可以实现的,即父类指针指向子类对象

三、   多态的总结

u 1)没有继承就没有多态

u 2)代码的体现:父类类型的指针指向子类对象

u 3)好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了。

u 4)局限性:父类类型的变量不能直接调用子类特有的方法,如果必须要调用,则必须强制转换为子类特有的方法。

四、   多态的一些注意事项

1、Oc语言是一门弱语法的语言,编译的时候并不会报错,所以这就要求我们在实际的开发过程中一定要按照既定的规范来写代码,不要出现狗是一个字符串这样的问题。如:

Dog *d=[[Animal  alloc] init];   动物是一条狗?语义不正确

NSString *str=[Dog  new];     狗是一个字符串?不正确

 

2、多态的好处:

需要一个新的函数专门用来喂狗

Void feed(Dog *d)

{

[d  eat];

}

如果这个时候也需要喂猫,那就应该重写新一个新的函数

Void feed(Cat *c)

{

[c  eat];

}

分析:而狗和猫实际上都继承自动物这个类,在这里就可以使用多态来简化代码了。

这里只需要把函数的参数写成是Animal *类型的,那么Dog和Cat类型的对象就都可以传入进来。调用的时候直接改变参数就可以了。

 

3、多态的局限性:父类类型的指针变量不能直接调用子类特有的方法。

Animal *aa=[[Dog alloc] init];

[a run];//在Animal类中没有run方法,这里调用了狗对象的方法。

可以改为:可以将a强制转换为Dog*类型的变量,如下:

Dog *d=(Dog *)a;//使用强制转换,这里a和d指向的是同一个狗对象

 

黑马程序员—15-oc多态