@interface ViewController :UIViewController
上面一行代码展现继承语法,
Objective-C只支持单继承,但可以实现多个协议(接口),
例如:@interface AppDelegate :UIResponder <UIApplicationDelegate,UITabBarControllerDelegate>
话说即便是C++支持多继承,但是大多数情况我们继承多个观察者(Observer)类。严格意义上将Observer跟Delegate不一样,但是却干了同样的事儿。
*以下博文来源 :http://justcoding.iteye.com/blog/1453902 本人稍加修改。
protocol和delegate完全不是一回事,放在一起说,只是因为我们经常在同一个头文件里看到这两个关键字。
协议(protocol): 就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现。
委托(delegate):顾名思义就是委托别人办事,就是当 一件事情发生后,自己不处理,让别人(称之为代理人)来处理。
这里需要注意:自己是委托人,别人是代理人。delegate模式说的就是:“‘委托人’让‘代理人’做一些事情的方法”叫做delegate。
举个浅显的例子:
我上班的工作主要内容包括 1.写代码,2.写文档,3.测试程序,4.接电话,5.会见客户。
其中第1,2两项是我自己全权负责,但是后面3、4、5我不想或者不方便自己做,所以我想找个助手(代理人)帮我做这些事,于是我定了一个招聘要求(Protocol),里写明我的助手需要会做3、4、5这三件事。很快,我招到一个助手。
即:我.delegate (理解为代理人)= 助手;
于是以后每当我遇到需要测试程序或者接电话的活,我就把他转交给助手(代理人)去处理,助手处理完后如果有处理结果,助手会告诉我,也许我会拿来用。如果不需要或者没有结果,我就接着做下面的事。。
protocol和java里interface的概念类似,或者C++中的纯虚类,是Objective-C语法的一部分。
定义protocol如下:
上面就是定义了一组函数,这组函数放在一起叫作一个protocol,也就是协议。
函数是需要被实现的,所以如果对于ClassAssistant,如下:
就叫作ClassAssistant conform to protocol AssistantDelegate,也就是说ClassAssistant实现了这个协议,也就是实现了这一组函数。
所以protocol就是一组函数定义,是从类声明中剥离出来的一组定义。
这种用法也常见,b是一个id类型(参考http://blog.csdn.net/hherima/article/details/8620941),它知道AssistantDelegate这组函数的实现。
那么delegate是什么?其实和protocol没有关系。Delegate本身应该称为一种设计模式。
是把一个类自己需要做的一部分事情,让另一个类(也可以就是自己本身)来完成。
比如MyClass代表我自己
那么MyClass的实现(.m文件)里就可以用delegate这个变量了。
这样我们知道了delegate是一个AssistantDelegate,它就可以提供ClassAssistant里的方法。
可以把一部分MyClass里的工作放在ClassAssistant里去实现。
MyClass和AssistantDelegate应该是关联关系,图上没有展现出来。
所以说其实delegate只是一种模式,大家约定俗成,当把自己内部一部分实现暴露给另外一个类去做的时候,就叫实际做事的类为delegate。