OC多态特性详解
2015-11-18 21:26
309 查看
多态在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>
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>
相关文章推荐
- 表单验证
- 视图
- C# id 字符串之类的拼接
- oracle系统包——dbms_job用法(oracle定时任务)
- android:使用网络通信技术从客户端直接获取服务端的对象数据
- poj 1915 Knight Moves【BFS】【简单】
- shell入门-grep-3-egrep
- XMLHttpRequest对象的属性
- 【Head First设计模式-读书笔记】策略模式
- MSXML 解析XML文件
- 事件与委托---实现事件分发中心
- 卡尔曼滤波+opencv 实现跟踪人脸 小demo
- 模型
- AJAX 在IE 下提交到后台乱码,但ff不会
- session 讲解
- R绘图-坐标中断的柱状图
- CodeTyphon自带例子源码:限制运行日期
- ubuntu12.04下搭建android开发环境
- 数据库与MATLAB链接http://blog.sina.com.cn/s/blog_9d0b00a401012spy.html
- 如何增大UDP收包效率