[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十一章 分类和协议
2015-07-06 22:33
274 查看
Part 1. 分类
分类提供了一种简单的方式,用它可以将类的定义模块化到相关方法的组成分类中。还提供了扩展现有类定义的简便方式。原始Fraction类的接口部分
#import <Foundation/Foundationh> @interface Fraction : NSObject @property int numerator, denominator; -(void) setTo: (int) n over: (int)d; -(Fraction *) add: (Fraction *)f; -(void) reduce; -(double) convertToNum; -(void) print; @end
添加其他三种要进行的数学运算,新的MathOps分类的接口部分:
#import "Fraction.h" @interface Fraction (MathOps) //告诉编译器你在为Fraction类定义新的分类 -(Fraction *) add: (Fraction *)f; -(Fraction *) mul: (Fraction *)f; -(Fraction *) sub: (Fraction *)f; -(Fraction *) div: (Fraction *)f; @end
作为分类的.h,.m文件的名称
FractionMathOps
Fraction+MathOps
Part 2. 类的扩展
类的扩展:定义一个未命名的分类。例: Fraction :()。- 可以通过定义额外的实例变量和属性来扩展类。
- 未命名分类中声明的方法要在主实现区实现,而不是在奋力的实现区实现。
- 如果需要写一个类,而且数据和方法仅供这个类本身使用,则适合使用未命名类,因为其方法是私有的:方法并没有在接口部分登记。如果知道私有方法的名字,也可以调用。
Part 3. 协议和代理
协议:多个类共享的一个方法列表。协议中列出的方法没有相应的实现,而是计划由其他人来实现。
协议提供了一种方式:用指定的名称定义一组有相关性的方法。
协议的定义:@protocol + 协议名称
//在标准的Foundation头文件NSObject.h中定义NSCopying协议的方式 NSObject.h: @protocol NSCopying -(id) copyWithZone: (NSZone *) zone; @end
告知编译器正在使用某协议:
@interface AddressBook: NSObject <NSCopying> //不必在接口部分声明这些方法,因为系统知道这个协议定义的方法。不过还是要在实现部分定义他们
同一类采用多项协议:
@interface AddressBook: NSObject <NSCopying, NSCoding>
如果一个类遵守NSCopying协议,那么他的子类也遵守此协议。
希望继承你的类的用户实现一些方法:
@protocol Drawing -(void) paint; -(void) erase; @optional //以下列出的方法都是可选的:采用Drawing方法不一定要实现outline方法来遵守该协议。 -(void) outline;
这些方法不必被你实现,而是需要指定一些方法让创建子类的人实现这些方法。
Ractangle是子类,并宣称遵守Drawing协议的话,那么就可以发送paint,erase,outline(可选)消息。
检查一个对象是否遵循某项协议:
id currentObject; if ([currentObject conformsToProtocol: @protocol (Drawing)] == YES) { //给 currentObject发送 paint, erase 或者 outline 消息 }
检查一个对象是否实现了可选的outline方法:
if ([currentObject respondsToSelector: @selector (outline)] == YES) { [currentObject outline]; }
Part 4. 代理
协议可以看做两个类之间的接口定义,定义了协议的类可以看做是将协议定义的方法代理给了实现他们的类。Part 5. 非正式协议
非正式协议实际上是一个分类,列出了一组方法并没有实现他们。如果一个对象采用正式协议,则它必须遵守协议中的所有信息。
如果一个对象采用非正式协议,则他可能不需要采用此协议的所有方法。
Part 6. 合成对象
定义一个类,它包含其他类的一个或多个对象,这个类的对象就叫做合成对象。子类的缺陷:依赖于父类,改变父类有可能会使得子类不能正常工作。
子类的替代:新类:包含了要扩展类的实例变量。
@interface Square: NSObject { Rectangle *rect; //(被)扩展类的实例变量 } -(int) setSide: (int) s; -(int) side; -(int) area; -(int) perimeter; @end
相关文章推荐
- 运行时runbime
- iOS_Objective-C_控件中的字体加粗
- ./show_file: error while loading shared libraries: libts-0.0.so.0: cannot open shared object file: N
- [Objective-C] 012_数据持久化_XML属性列表,NSUserDefaults
- IOS 关于objc_setAssociatedObject,objc_getAssociatedObject
- object-c的异常处理机制
- Objective-C中获取类名
- JSONObject基本内容(二)
- JSONObject基本内容(一)
- [Objective-C] property setter/getter via @property
- 【Effective Objective-C 2.0读书笔记】第三章:接口和API设计
- Object与equals与HashCode
- byte to object and object to byte
- Objective-C语法之NSString与int和float的相互转换
- Objective-C Runtime中的并发内存分配
- html之object标签的classid收集
- IOS中的关联对象实现objc_setAssociatedObject
- Exception AttributeError: "'NoneType' object has no attribute错误
- (Java 功能代码)java去除List中重复数据之Object对象
- 介绍一下Objective-c常用的函数,常数变量