第二章、Objective-c 语法,继承,protocol和delegate(iOS学习笔记,从零开始)

OC是面向对象编程语言。

@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如下:

  1. @protocolAssistantDelegate  
  2.    
  3. - (void)testApp;       //测试程序
  4. - (void)answerCall;    //接电话
  5. - (void)clientMeeting; //会见客户
  6.    
  7. @end  

上面就是定义了一组函数,这组函数放在一起叫作一个protocol,也就是协议。

 

函数是需要被实现的,所以如果对于ClassAssistant,如下:

  1. @interface ClassAssistant <AssistantDelegate> 
  2. {  
  3.    //do something 
  4. }  
  5. @end 


就叫作ClassAssistant conform to protocol AssistantDelegate,也就是说ClassAssistant实现了这个协议,也就是实现了这一组函数。

 

所以protocol就是一组函数定义,是从类声明中剥离出来的一组定义。

  1. id<AssistantDelegate> b = ...;  
  2. [b testApp];  

这种用法也常见,b是一个id类型(参考http://blog.csdn.net/hherima/article/details/8620941),它知道AssistantDelegate这组函数的实现。

 

那么delegate是什么?其实和protocol没有关系。Delegate本身应该称为一种设计模式。

是把一个类自己需要做的一部分事情,让另一个类(也可以就是自己本身)来完成。

比如MyClass代表我自己

  1. @interface MyClass {  
  2.     id delegate;  
  3. }  
  4. @end  

那么MyClass的实现(.m文件)里就可以用delegate这个变量了。


这样我们知道了delegate是一个AssistantDelegate,它就可以提供ClassAssistant里的方法。

可以把一部分MyClass里的工作放在ClassAssistant里去实现。

 

第二章、Objective-c 语法,继承,protocol和delegate(iOS学习笔记,从零开始)_第1张图片


MyClass和AssistantDelegate应该是关联关系,图上没有展现出来。


所以说其实delegate只是一种模式,大家约定俗成,当把自己内部一部分实现暴露给另外一个类去做的时候,就叫实际做事的类为delegate。





你可能感兴趣的:(继承,语法)