Objective-C 程序设计 第十一章

分类和协议

通过分类以模块的形式向类添加方法。以及如何创建标准化的方法列表提供给他人实现。


分类

给已知类添加功能时,可以考虑新建子类,并实现新方法,使用子类。

更简单的办法,分类。

分类,可以将类的定义模块化到相关方法的组或分类中。

它还提供了扩展现有类的简便方式,并且不必访问类的源代码,也无须创建子类。


语法:

类似于创建一个类。

区别在于: @interface Fraction (MathOps)

这就是创建了一个Fraction的分类MathOps

实现部分可以放在一个实现部分,也可以单独放在一个文件。

@implementation Fraction (MathOps)

文件名称可以考虑Fraction+MathOps.h

如果将分类放到一个主类定义文件中,那么这个类的所有用户都将访问这个分类中的方法。

如果不能直接修改原文件,那就只能选择单独保存分类。


类的扩展

无名分类。

在定义分类时(), 中不写名字。

定义一个像这样的无名分类时,可以使用额外的实例变量和属性来扩展类。只有无名分类可以这样做。

无名分类中声明的方法需要在主实现区域实现。

无名分类非常有用,因为它们的方法都是私有的。如果想将一个方法做成私有的,可以将其放入无名分类。

注意:方法没有在接口部分登记,在这个意义上它们是私有的。然而,如果你知道私有方法的名字,那么也可以调用它。

在实现部分:

@interface Fraction ()

- (void) reduce;

@end


关于分类的注意事项

分类可以覆写该类中的另一个方法,但是很不建议这么做。

1. 覆写之后,再也不能访问之前的方法。如果确实需要覆写的话,使用子类来覆写。可以使用super来访问父类的方法。

通过使用分类添加新方法来扩展类不仅会影响这个类,同时会影响它的所有子类。

同样,对象/分类命名对必须是唯一的。因为Objective-C名称空间是程序代码与所有的库、框架和插件共享的。


协议和代理

协议是多个类共享的一个方法列表。

协议列出了一组方法,有些可以选择实现,有些必须实现。如果采用该协议,就需要遵守。

语法:

@protocol NSCoping

- (id) copyWithZone: (NSZone *)zone;

@end


如果某个类采用某个协议,语法如下:

@interface AddressBook: NSObject <NSCoping>,编译器期望找到AddressBook实现部分的copyWithZone的实现。

如果有多个协议,使用逗号隔开。 <A, B>


如果你定义了自己的协议,那么不必自己实现它。可以告诉别人,如果采用这个协议,则必须实现这些方法。

这些方法可以从超类继承。

如果父类遵守NSCoping协议,那么它的子类也遵守NSCoping,但有可能子类需要自己定制实现。


@protocol NSCoping

- (id) copyWithZone: (NSZone *)zone;

@optionnal

- (void) outline;

@end

optionnal,可以标识选择性实现的方法。@optionnal,可以标识选择性实现的方法。

required,可以列出需要的方法。


注意,协议不引用任何类,它是无类的。

可以使用conformsToProtocol方法检查一个对象是否遵循某项协议。

id obj1;

if ([obj1 conforsToProtocol: @protocol (Drawing)] == YES)

{}

可以使用respondsToSelector测试是否实现了可选的outline方法。


id <Drawing> obj1;   多条协议使用逗号。

通过在类型名称之后的尖括号中添加协议名称,借助编译器来检查变量的一致性。

如果给obj1赋值的对象并不遵守Drawing协议,则会警告。


@protocol Drawing3D <Drawing>

可以扩展协议。表示Drawing3D首先遵守Drawing。


分类也可以遵守某些协议。也可以在实现部分使用无名分类()来进行扩展协议。


代理

协议也是一种两个类之间的借口定义。定义了协议的类可以看作是将协议定义的方法代理给了实现它们的类。

这样,类的定义可以更为通用,因为具体的动作由代理类来承担,响应某些事件或者定义某些参数。


非正式协议,看起来像一个分类。列出了一些方法,而没有实现它们。

非正式协议通常是为根类定义的。有时也被称为抽象协议。

它实际上仅仅是一个名称下的一组方法,在文档说明和模块化方法时,可能有所帮助。

可以使用optional 取代这个非正式协议。


合成对象。

实际是使用组合的方式包装出来一个适合需求的类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值