Object—C编程详解(四)-协议(protocol)

来源:互联网 发布:学笛子的软件 编辑:程序博客网 时间:2024/06/03 20:29

协议

协议的功能类似于c++中对抽象基类的多重继承。协议是多个类共享方法的列表。协议中列出的方法在本类中并没有相应的实现,而是由别的类来实现这些方法。如果一个类要遵守一个协议,该类就必须实现特定协议的所有方法(可选方法除外)。

非正式协议

非正式协议是NSObject类(显而易见,还包括它的子类)的类别,其所有的子类都含蓄地接受了这个协议。(类别是Objective-C的一个语言特点,可以让你在无需子类化的前提下为一个类增加方法。)非正式协议中的方法是否实现都是可选的,因此在调用非正式协议中的方法之前,需要去检查对象类是否实现了它。在Objective-C2.0中引入可选的正式协议方法之前,非正式协议是Foundation和AppKit类实现委托的唯一方式。

类别(catgory)可以实现非正式协议,这种以NSObject类为基础,为NSObject创建类别,创建类别时即可指定该类别应该新增的方法。当某个类实现NSObject的该类别时,就需要实现该类别下的所有方法,这种基于NSObject定义的类别即可认为是非正式协议。

正式协议

定义一个协议需要使用@protocol指令,紧跟着是协议名称,然后是声明的一些方法,在指令@end之前的所有方法的声明都是协议的一部分。

@protocol 协议名 <父协议1,父协议2>{         零到多个方法定义....}

说明:

1.协议名应与类名采用相同的命名规则。即如果仅从语法角度来看,协议名只要是合法的标示符即可。

2.一个协议可以有多个直接父协议,但协议只能是继承协议,不能继承类。

3.协议中定义的方法只有方法签名,没有方法实现;协议中包含的方法即可是类方法,也可是实例方法。

4.协议定义的是多个类共同的公告行为规范,因此,协议里所有的方法都是公开的访问权限。

非正式协议与正式协议的区别

1.非正式协议通过为NSObject创建类别来实现,而正是协议则直接使用@protocol创建。

2.遵守非正式协议通过继承带特定类别的NSObject来实现;而遵守正式协议则有专门的语法。

3.遵守非正式协议不要求实现协议中定义的所有方法;而遵守正式协议则必须实现协议中定义的所有方法。


为了弥补遵守正式协议必须实现协议的所有方法造成灵活性不足,Object-C2.0新增@optional、@required。

@required

该类的方法在遵守相应协议的类中是必须被实现的,不然编译器会告警(显然这是在编译时做的检查,而不是在运行时)

@optional

该类的方法在遵守相应协议的类中是否实现是可选


协议与委托(delegate)

协议体现的是一种规范,定义协议的类可以把协议定义的方法委托给实现协议的类,这样可以让类定义具有更好的通用性质,因为具体的动作交给协议的实现类去完成。无论是基于Mac的Cocoa应用开发,还是ios应用开发,各种应用程序大量依赖委托。


0 0