- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十五章:多态、动态类型和动态绑定 多态、动态类型和动态绑定 多态:来自不同类的对象可以定义共享相同名称的方法 动态类型:能使程序直到执行时才确定对象所属的类型 动态绑定:能使程序直到执行时才确定要对对象调用的实际方法 多态 动态类型:id类型 id类型是一个通用的对象类型,可以存储任何对象。 声明id类型时不要星号(*) 不要养成滥用这种数据类型的习惯 静态类型能更好地在程序编译阶段(而不是在运行时)指出错误 程序可读性不好 有关类的问题 这个对象是矩形吗? 这个对象支持print方法吗? 这个对象是Graphics类或是其子类的成员吗? 有关类的问题 有关类的问题 有关类的问题 有关类的问题 有关类的问题 使用@try处理异常 多态:不同类名,相同方法名 如: Person类中可以定义eat方法 Bird类也可以定义eat方法 问:如果id类型可以存储任何类型的对象,那么系统如何知道该调用哪一个方法呢? 答:Objective-C系统先判断对象所属于的类,并因此确定运行时(而不是编译时)需要动态调用的方法 id f1; 和 Fracrtion *f1; 开始使用包含来自不同类的对象时,可能遇到一下问题: 方法 问题或行为 -(BOOL) isKindOf: class-object 对象是否为class-object或其父类 -(BOOL) isMemberOf: class-object 对象是否为class-object -(BOOL) respondsToSeletor:selector 对象是否能响应selector指定的方法 +(BOOL) instanceRespondToSeletor:selector 指定的类实例是否能响应selector? +(BOOL) isSubclassOfClass:class-object 对象是指定类的子类吗? -(id) performSelector:selector 应用selector指定的方法 根据类名或一个对象生成一个class-object,可以发送class消息 [Square class];//通过类名声明 [mySquare class];//通过对象名声明 判定两个对象是否在一个类 if([obj1 class] == [obj2 class]) -(id)PerformSelector:selector SEL action; id graphicObject; ...... action = @selector (draw); [graphicObjectperformSelector: action]; SEL action = @selector (draw); id graphicObject = myFraction; if([graphicObjectrespondsToSelector:action] == YES) [graphicObjectperformSelector:action] else //error handling code here -(BOOL) respondsToSeletor:selector @selector指令: 为某个方法生成一个SEL值 @selector(alloc) @selector(setTo:over:) [Square instanceOfRespondToSelector:@selecor(setSide)]; #import Fraction.h” #import Complex.h” intmain (intargc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePoolalloc] init]; id dataValue;Fraction *myFraction= [[Fraction alloc] init]; [myFractionsetNumerator: 2 andDenominator: 5]; //first dataValue gets a fraction SEL action = @selector (print); dataValue= myFraction; if( [dataValuerespondsToSelector:action] == YES ) { [dataValueperformSelector:action]; } else { return 0; } [pool drain]; return 0; } #import Fracti
文档评论(0)