一.基本概念
多态在代码中的体现,即为多种形态,首先必须要有继承,没有继承就没有多态.
在使用多态的时候,会进行自动的检测,以调用真实的对象方法.
多态的本质就是父类指针指向子类对象.
Animal类的声明:
#import//声明一个Animal类,该类继承NSobject
@interface Animal : NSObject
///animal中声明一个eat的对象方法
- (void)eat;
@end
#import "Animal.h"
@implementation Animal
//eat对象方法的实现
-(void)eat{
NSLog(@"动物吃东西");
}
@end
#import "Dog.h"
@implementation Dog
///重写eat方法,也就是重写父类方法
-(void)eat{
NSLog(@"🐶吃东西");
}
@end
#import#import "Animal.h"
#import "Dog.h"
int main(int argc, const char * argv[]) {
//Dog类型的指针指向Dog类型的对象
Dog *dog = [[Dog alloc] init];
//Dog类调用对象方法
[dog eat];
//多态
//父类指针指向子类对象
Animal *animal = [[Dog alloc]init];
//父类对象调用子类方法(调用的是Dog里面的方法)
[animal eat];
//动态监测--调用方法时,会监测对象的真实类型
///Animal类型的指针指向Animal类型的对象
Animal *a1 = [[Animal alloc]init];
[a1 eat];
///下面都是多态的体现
NSObject *n = [[Dog alloc]init];
// [n eat];不能这样调用
NSObject *n1 = [[Animal alloc]init];
return 0;
}
二:使用注意
代码分析:
Dog *d = [[Animal alloc]init];
//动物是条狗???
NSString *str = [Dog new];
//狗是字符串???
// OC语言是一门弱语法的语言,编译时并不会报错,所以我们要按照规范来写代码,不要出现狗是字符串这样的问题.
多态的好处:
需要一个新的函数专门用来喂狗
Void feed(Dog *d)
{
[d eat];
}
如果这个时候也需要喂猫,那就应该重写新一个新的函数
Void feed(Cat *c)
{
[c eat];
}
而狗和猫都继承动物这个类,在这里可以使用多态的代码来简化代码了,这里只需要把函数的参数改写成Animal*类型的,那么Dog和Cat类型的对象就可以传入进来,调用的时候直接把参数改了就行了.
多态的局限性:父类指针变量不能直接调用子类的特有方法,
不建议的做法:
Animal *aa = [[Dog alloc] init];
// [aa ran];在Animal类中没有ran方法,这里调用狗对象的方法.
//解决方法 可以将a强制转化为Dog类型的变量,如下:
Dog * doq = (Dog *)aa;//这里的aa指向狗对象
[doq ran];
三:多态的总结:
1.没有继承就没有多态
2.代码的体现:父类类型的指针指向子类对象
3.好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数和相应的类型进行匹配了,
4,局限性:父类类型的变量不能直接调用子类特有的方法,如果必须要调用,则必须强转为子类特有的方法;
网友评论