zoukankan      html  css  js  c++  java
  • protocol 和delegate(协议和代理)的区别

    定义

    protocol:中文叫协议,一个只有方法体(没有具体实现)的类,Java中称作接口,实现协议的类必须实现协议中@required标记的方法(如果有的话);

    delegate:中文叫代理或委托,是一种设计模式。以协议的方式去体现(可以理解为协议的一种),区别在于代码中常以<xxxDeletgate>标示,以便清晰辨明此为代理。

    举例说明

    下面以一个ViewController要绘制TableView来进行说明:

    要绘制TableView,首先要实现两个协议 UITableViewDataSource,UITableViewDelegate 

    我们先看看UITableViewDataSource里边都是怎么写的。

    两个@required标明必须实现的方法,其他都是可选进行实现的方法

    再来看看UITableViewDelegate 里都是怎么写的。

    全是可选的方法,willxxx、didxxx 什么的,看起来跟UITableViewDataSource里的好像不太一样。

    然后在http://blog.csdn.net/huifeidexin_1/article/details/7567731 这篇文章里,作者总结了代理的2个作用:

    其次,我简单的总结了一下自己用到的委托的作用有两个,一个是传值,一个是传事件。
    1.所谓传值经常用在b类要把自己的一个数据或者对象传给a类,让a类去展示或者处理。(切分紧耦合,和代码分块的时候经常用)
    2.所谓传事件就是a类发生了什么事,把这件事告诉关注自己的人,也就是委托的对象,由委托的对象去考虑发生这个事件后应该做出什么反映。(这个经常见,例如在异步请求中,界面事件触发数据层改变等等)
    3.利用委托赋值,这种方法感觉是为了不暴露自己的属性就可以给自己复值,而且这样更方便了类的管理,只有在你想要让别人给你赋值的时候才调用,这样的赋值更可控一些。(例如tableView中的委托(dateSource)中常见)。

    根据作者的描述,此代理的作用应该是传递事件。

    等等,你说什么,好像不实现也没什么影响?再来看看另一个作者怎么说的。https://segmentfault.com/q/1010000003099524

    你没完全理解“委托”的意思哈:)

    首先,如楼上所说, @optional 后面的所有方法都是可选的。也就是说, UIActionSheetDelegate 里面所有的方法都是不必须实现的。

    其次,就算你一个方法都不实现,actionSheet 也一样能“跑起来”,就是能正常显示出来,能正常点击。问题在于,你无法指定点击了之后干什么。

    通过实现这些委托方法,你才能指定点击按钮之后干什么。从方法名就能看出含义,比如如果用户点击了按钮,就会调用委托的 clickedButtonAtIndex 方法了,就会执行你写在这个方法里的代码;如果你没实现这个方法,它就什么都不做。

    那么 self.xxx.delegate = self 是什么意思? 摘自http://swiftist.org/topics/350

    1.delegate在ios的开发中很常见,中文翻译成委托或者代理,意思我委托你帮我处理一些事情,delegate通常是以protocol形式出现,意思你要成为我的代理必须实现某些协议。

    2.比如你在ViewController上放置了一个UITableView,如果你想在UITableView的Cell在被按下时做一些事情,就可以通知其delegate,我有一个cell被按下了,并附上cell的indexPath,通知的方式就是调用delegate的相关函数。

    3.在上面的场景中,就需要将ViewController作为UITableView的delegate,并且ViewController必须要实现UITableViewDelegate的相关方法

    还不理解的话,有个更通俗的解释 http://www.cocoachina.com/bbs/read.php?tid=259133

    “委托的意思不就是自己的任务交给其他人去做么”你这么理解是对的

    对象.delegate=self的意思就是对象的任务交给self去做  对象!=self  

    假如你有对象A 对象B ,A是B的成员变量

    class B

    {

            member A

    }

    在B中写这么一句“A.delegate=self”

    按你的理解 应该是A的任务交给B去完成 理解了没

    综上所述

    普通的协议只是一个公共的接口,里面会规定你必须实现的一些东西;代理(一种特殊的协议),你实现其中方法的话,就是告诉发布代理的类,这件事你去做了。

    个人愚见,不对之处,还请指出。

    其他介绍两者区别的文章:

    http://www.cnblogs.com/qingjoin/archive/2012/11/22/2782602.html

    http://blog.csdn.net/chiuan/article/details/7539010

  • 相关阅读:
    张季跃 201771010139《面向对象程序设计(java)》第三周学习总结
    实验十二
    201771010142 张燕& 杨蓉庆 实验十一 集合
    实验十 泛型程序设计技术
    第九次实验
    第八次实验
    进度条
    实验七 继承附加实验
    第六次实验
    实验四
  • 原文地址:https://www.cnblogs.com/36bian/p/5240517.html
Copyright © 2011-2022 走看看