---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
在说到正式协议之前,还有一种叫做非正式协议。
非正式协议
非正式协议使用分类(category)来实现,非正式协议是NSObject的一个分类,这样任何类的对象都可以作为委托对象来使用,它可以列出对象能够执行的所有方法,这样用来实现委托, 我们可以使用选择器来判断该非正式协议中是否有这个方法。
正式协议
与非正式协议一样,正式协议是包含了方法和属性的有名称列表。但与非正式协议不同的是,正式协议要显式地采用。采用协议地办法是在类地@interface声明中列出协议地名称。
声明协议
来看一下Cocoa声明地一个协议,NSCopying。如果你采用了NSCopying协议。你的对象就会知道如何创建自身地副本。
@protocol NSCopying
- (id) copyWithZone: (NSZone *) zone;
@end
@protocol后面是协议名称。协议名称必须是唯一的。
也可以继承父协议,与继承父类有些类似。在声明语句协议名称后面的尖括号内可以指定父协议的名称。
@protocol MySuperDuberProtocol <MyParentProtocol>
@end
第一行代码表示MySuperDuberProtocol协议继承于MyParentProtocol协议,因此你必须要实现两个协议中所需要实现的方法。
再来看一看例子。下面是Cocoa的NSCoding协议:
@protocol NSCoding
- (void) encodeWithCoder: (NSCoder *) encoder;
- (id) initWithCoder: (NSCoder *) decoder;
@end
当某个类采用NSCoding协议时,便意味着该类将实现这两个方法。encodeWithCoder:方法用于接受对象的实例变量并将其转换为NSCoder类的对象。initWithCoder:方法从NSCoder类的对象中提取经过转换的实例变量,并使用它们去初始化新的对象。这两个方法总是成对出现的。
采用协议
如果要采用某个协议,可以在类的声明中列出该协议的名称,并用尖括号括起来。例如,Car类要想采用NSCopying协议。则类的声明如下:
@interface Car : NSObject <NSCopying>
{
// instance variables
}
// methods
@end
而如果Car类要采用NSCopying和NSCoding这两个协议。则声明如下:
@interface Car : NSObject <NSCopying, NSCoding>
{
// instance variables
}
// methods
@end
接着就是实现协议了。将在下一篇博客进行学习使用。
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------