多态在OC中,是面向对象的特性。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。在OC中的本质就是:允许将子类类型的指针赋值给父类类型的指针,再调用父类的方法,这个方法既可以是子类重写过的(会执行子类的方法),也可以是父类方法中传入id类型,从而达到多态的特性。
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
OC中的多态:不同对象对同一消息的不同响应。
这里详细说明两点:
1:父类定义了一个方法后,子类可以重写该方法,使用时,如果把子类的对象赋值给父类类型指针时,那么调用方法时,会响应子类的方法。
2:多态的实现,引入了一个非常重要且常见的数据类型:id类型,这是一个万能指针,它可以指向任意的类型,其本质是一种动态检查类型,编译时并不知道其具体指向了什么类型,那么定义的时候就随意的使用,当然为了防止id指向的对象跟父类不对应或是对象的方法不存在,引入了几种常见的检查函数,实例中会详解。
实例:
<textarea readonly="readonly" name="code" class="object-c">
父类Animal的.h文件:
#import <Cocoa/Cocoa.h>
@interface Animal : NSObject
@property (nonatomic,strong) NSString *name;
-(void)eat:(id)animal;
@end
父类Animal的.m文件:
#import "Animal.h"
@implementation Animal
-(void)eat:(id)animal{
//id 类型是万能指针,可以指向任意的对象,实在使用中可以使用多种方法来检测是否有这个对象或者有这个方法,
[animal run];
NSLog(@"%@在吃",_name);
}
@end
子类Dog的文件
.h文件:
#import "Animal.h"
@interface Dog : Animal
@end
.m文件:
#import "Dog.h"
@implementation Dog
-(void)run{
NSLog(@"狗在跑");
}
@end
子类Cat的文件
.h文件:
#import "Animal.h"
@interface Cat : Animal
@end
.m文件:
#import "Cat.h"
@implementation Cat
-(void)run{
NSLog(@"猫在跑");
}
@end
.main文件:
#import <Foundation/Foundation.h>
#import "Animal.h"
#import "Dog.h"
#import "Cat.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Animal * ani = [[Animal alloc]init];
Dog * dog = [Dog new];
dog.name = @"汪汪";
ani = dog;
//dog对象是否有run方法
[dog respondsToSelector:@selector(run)];
//dog对象是否是Animal的子类
[dog isKindOfClass:[Animal class]];
//dog是否是Animal类
[dog isMemberOfClass:[Animal class]];
NSLog(@"%d", [dog respondsToSelector:@selector(run)] );
NSLog(@"%d",[dog isKindOfClass:[Animal class]]);
NSLog(@"%d",[ani isMemberOfClass:[Animal class]]);
[ani eat:dog];
}
return 0;
}
</textarea>