[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十一章 分类和协议
来源:互联网 发布:sql count(1) 编辑:程序博客网 时间:2024/04/19 07:24
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
0 0
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十一章 分类和协议
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第四章 数据类型和表达式
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十章 变量和数据类型
- objective-C程序设计学习笔记3--分类和协议
- [学习笔记—Objective-C]《Objective-C-基础教程 第2版》第十一章 属性
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第六章 选择结构
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第七章 类
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第八章 继承
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十二章 预处理程序
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十八章 复制对象
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第三章 类,对象和方法
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第四章 数据类型和表达式 课后练习题 4-10
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第九章 多态,动态类型和动态绑定
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十五章 数字 字符串和集合
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十七章 内存管理和自动计数
- objective c 学习笔记:分类和协议
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》开始
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之11-分类和协议——黑马 IOS 技术博客
- Android PopupWindow的使用和分析
- 2. Zend_Controller 快速入门
- Java面向对象之重载和重写
- javaSE学习笔记之线程
- java面向对象编程基本概念
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十一章 分类和协议
- 第4章 基纳法 阅读(PageRank的兄弟)
- perl 面向对象 -> 符号使用
- 2.2 Zend_Controller 基础
- 键值表
- iOS7中的多任务
- linux变量的心得
- Android入门(14)——使用Spinner实现下拉列表
- Android实践-自定义dialog从屏幕底部弹出并且充满屏幕宽度