Chapter 9 : 分类和协议

1. 协议(protocol) : 其声明类于类接口的声明,不同的是,协议没有父类,且不能定义成员变量。

2. 协议(protocol)声明如下:

1 @protocol MyProtocol
2 
3     - (void)myProtocolMethod;
4 
5 @end

-> 协议(protocol)是多个类共享的一个方法列表(Methods List), 协议(protocol)中列出的方法没有相应的实现。如果一个类采用MyProtocol协议,则必须实现名为myProtocolMethod的方法。

3. 协议(protocol)的使用: 通过在@interface行的一对尖括号<...>内列出协议(protocol)名称,可以告知编译器你正在采用一个协议(protocol)。这项协议名称放在类名和它的父类名称之后,如下:

1 @interface AddressBook : NSObject <myProtocol>

此代码说明:AddressBook是NSObject的子类,并遵守myProtocol协议。在AddressBook的实现部分,编译器期望找到定义的myProtocolMethod方法。

使用多项协议,只需要将它们列在尖括号中:

1 @interface AddressBook : NSObject <myProtocol, yourProtocol>

4. 协议(protocol)注意事项:

-> 如果一个类遵守某项协议(protocol), 那么它的子类也遵守该协议(protocol)。

-> 协议(protocol)不引用任何类,它是无类的(classless)。任何类都可以遵守某项协议。

-> 通过在类名称之后的尖括号中添加协议名称,可以借助编译器的帮助来检查变量的一致性,如下:

1 id <Drawing> currentObject;

这将告知编译器currentObject将包含遵守Drawing协议的对象,如果向currentObject指派静态类型的对象,这个对象不遵守Drawing协议,编译器将给出warning。

注意:如果向currentObject指派一个id变量,则不会产生warning,因为编译器不知道存储在id变量中的对象是否遵守Drawing协议。

-> 如果变量保存的对象遵守多项协议,也可列出多项协议,如下:

1 id <Drawing, Drawing1> currentObject;

-> 定义一项协议旱,可以扩展现有协议的定义,如下:

1 @protocol Drawing3D <Drawing>

说明Drawing3D协议也采用了Drawing协议。因此采用Drawing3D协议的类都必须实现此协议列出的方法以及Drawing协议的方法。

-> 分类(Category)中也可采用协议, 如下:

1 @interface Fraction (stuff) <NSCopying, NSCoding>

此处,Fraction拥有一个分类stuff, 这个分类(Category)采用了NSCopying和NSCoding协议。

 

 

posted on 2012-09-28 12:02  BankFish  阅读(266)  评论(0编辑  收藏  举报