[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十一章 分类和协议

原创 2015年07月06日 22:33:58

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

[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第三章 类,对象和方法 课后题解析 3-7

第三章的课后题多半都比较主观,在此只分享第七题。第七题几乎囊括了第三章左右的知识点,非常典型。以下是题目和本人编写的代码。为了方便起见,将头文件,实现文件,主函数文件合并到了一起。 3-7 定义一...

[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十八章 复制对象

origin = pt; 将对象pt的地址复制到origin中。两个变量都指向内存中同一个地址 Foundation对象:将一个变量赋值给另一个对象仅仅创建了另一个对这个对象的引用(地址)。 Par...

[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第四章 数据类型和表达式

本章内容相对比较基础,容易理解。过于简单繁琐的内容在此不再赘述。这里只讲解本章的框架和比较重要的细节部分。 Part1. 数据类型和常量 基本数据类型 int: 值域和运行计算机的硬件设...

[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第七章 类

本章的学习笔记以本书第六章的例题(两个分数的加法)为主线展开,逐步介绍重要的知识点。Part 1. 合成存取方法从Objective-C 2.0 开始,可自动生成设置方法和取值方法:通过属性。接口文件...

[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第五章 循环结构 部分例题&课后题讲解

本章相对比较简单,知识点就不在赘述。主要就书中的例题和课后题进行说明。if 结构if 基本结构for ( int_expression; loop_condition; loop_expression...

[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第八章 继承

在子类使用实例变量,必须先在接口部分声明,在实现部分声明的实例变量是私有的 ClassB继承ClassA,ClassC继承ClassB. ClassC能继承ClassB的所有方法和实例变量,同时也一次...

[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十五章 数字 字符串和集合

Part 1. 数字对象 基本的数据类型不是对象,因此不能给他们发信息。但是有的时候需要将这些值作为对象使用:NSArry创建的数组存储的值必须是对象,因此数据类型无法直接存储到数组中,需要NSNum...

[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第九章 多态,动态类型和动态绑定

Part 1. 多态:相同的名称,不同的类 多态:使不同的类共享相同方法名称的能力称为多态。(可以开发一组可以相应相同方法名的类) //两个分数 Fraction *f...

[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第三章 类,对象和方法

本人于2015年6月10日开始自学ios开发。 此学习笔记是本人在学习《Objective-C 程序设计 第六版》的过程中,经本人修改,整理的内容。 略过第一,二章,从第三章有关类的概念开始。 ...

[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十章 变量和数据类型

Part 1. 实例变量和属性 目前的趋势是使用(_)作为实例变量名字的起始字符。 在实现部分显式声明实例变量是私有的 因此不能在子类中通过名字直接获取到实例变量的值。 在子类中只能通过继承的存取方...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十一章 分类和协议
举报原因:
原因补充:

(最多只允许输入30个字)