- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
11.2 协议 非正式协议 非正式协议实际上是一个分类,列出了一组方法但并没有实现他们。每个人都继承相同的根对象,因此非正式分类通常是为根类定义的。有时,非正式协议也称作抽象协议。 如果查看头文件NSScriptWhoseTests.h,可能会发现如下所示的一些方法声明: @interface NSObject (NSComparisonMethods) - (BOOL)isEqualTo:(id)object; - (BOOL)isLessThanOrEqualTo:(id)object; - (BOOL)isLessThan:(id)object; - (BOOL)isGreaterThanOrEqualTo:(id)object; - (BOOL)isGreaterThan:(id)object; - (BOOL)isNotEqualTo:(id)object; - (BOOL)doesContain:(id)object; - (BOOL)isLike:(NSString *)object; - (BOOL)isCaseInsensitiveLike:(NSString *)object; @end 11.2 协议 这些代码为NSObject类定义了一个名为NSComparisonMethods的分类。这项非正式协议列出了一组方法,可以将它们实现为协议的一部分。非正式协议实际上仅仅是一个名称下的一组方法。这在文档说明和模块化方法时,可能有所帮助。 声明非正式协议的类自己并不实现这些方法,并且选择实现这些方法的子类需要在它的接口部分重新声明这些方法,同时还要实现这些方法中的一个或多个。和正式协议不同,编译器不提供有关非正式协议的帮助; 如果一个对象采用正式协议,则它必须遵守协议中的所有信息。这可以在运行时以及编译时强制执行。如果一个对象采用非正式协议,则它可能不需要采用此协议的所有方法,具体取决于这项协议。可以在运行时强制要求遵守一项非正式协议,但是在编译时不可以。 第11章 分类和协议 协议 11.2 分类 11.1 合成对象 11.3 11.3 合成对象 你已经学习了通过派生子类和分类等技术扩展类定义的几种方式。有另一项设计定义一个包含其他类的一个或多个对象的技术。这个新类的对象就是所谓的合成(composite)对象,因为它是由其他对象组成的。 比如,考虑第8章中定义的Square类。将这个类定义为Rectangle的子类,因为你知道正方形就是等边的矩形。定义子类时,它继承了父类的所有实例变量和方法。在一些情况下,这种做法不合适。例如,在父类中定义的一些方法可能不适合子类使用。Square类继承了Rectangle的 setWidth:andHeight:方法,但并不合适。此外,创建子类时,必须确保所有被继承的方法能够正常工作,因为该类的用户可能会访问它们。 作为创建子类的替代方式,可以定义一个新类,它包含要扩展类的实例变量。然后,只需要新类中定义适合该类的方法。返回Square例子,下面是定义Square的另一种方式: 11.3 合成对象 @interface Square: NSObject { Rectangle *rect; } -(int) setSide: (int) s; -(int) side; -(int) area; -(int) perimeter; @end 和子类版本不同,子类版本允许你直接访问Rectangle的方法,但是这个Square的定义中不包括这些方法。这样做很有意义,因为处理Square时这些方法确实不合适。 如果以这种方式定义Square,就需要为它包含的矩形分配存储空间。例如,如果不重载方法,以下语句: Square *mySquare = [[Square alloc] init]; 分配了一个新的Square对象,但是没有为存储在其实例变量中的Rectangle对象rect分配存储空间。 11.3 合成对象 一个解决方案就是重载init或添加initWithSide:之类的新方法来分配空间。这个方法可以为Rectangle rect分配存储空间,并相应地设置它的边。还需要重载dealloc方法,以便在释放Square时,释放Rectangle rect占用的存储空间。 在Square类中定义方法时,可以使用Rectangle的方法。例如,下面说明了如何实现area方法: -(int) area { return [rect area]; } 武汉大学国际软件学院 Objective-C 2.0程
文档评论(0)