由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 谁能深入浅出的讲讲protocol和delegate的要点?
相关主题
大牛们对Object C有何点评?Scala有一点不好
问一个.NET与C++的问题C# 的问题, event 这个关键字有什么用?
求支持:在把C++编的cmake转成C#。。问个Winform与工作类的互动问题。
iOS程序开发有前途吗?delegate用中文怎么说?
Question about delegate in C#ajax in VB.net
很多有多年经验的Java程序员都会弄错的题目一个c++ constructor的问题, thanks
还没被劝退C++的都来看看这个吧最近开始接触Objetive C,发现多年的愿望实现了
还是成员函数指针,试试这个诡异的东东吧。How many people use design patterns when coding?
相关话题的讨论汇总
话题: delegate话题: protocol话题: 实现话题: 深入浅出话题: 方法
进入Programming版参与讨论
1 (共1页)
c******g
发帖数: 4889
1
对于protocol基本上明白其用途,只定义属性和方法,不具体实现;当class遵循这个
protocol的时候才需要提供实现。
可是这个delegate还不是很理解。
l******t
发帖数: 55733
2
就是投机倒把
c******g
发帖数: 4889
3
大牛们怎么都不吭声?我这个问题太基础,都不屑于回答么?
z****e
发帖数: 54598
4
protocol就是java里面的interface
就是一层皮或者叫做声明
定义了具体实现的东西的方法
需要具体实现,自身不能单独存在
delgation是一个design pattern
确切地说是oop的design pattern
意思就是说,你拿到一个东西
这个东西是另外一个东西的代理
你要跟另外一个东西做啥动作
不需要找到另外一个东西,只需要对付当前这个东西就可以了
举个例子
protocol Man{
func sayHi() -> String;
}
这里只声明了一个say hi方法,并没有具体实现
你要用class或者struct或者enum来实现
class Me:Man{
func sayHi() -> Sring{
println("hi");
return “hi”;//swift语法还不熟练,可能有错或者啥的
}
}
然后用的时候呢
Me me = new Me();
这里me其实就是一个东西
那么你可以通过protocol来做它的代理
Man man = me;
这里man就是me的代理,你要跟me做什么操作
比如sayHi();,你不需要me.sayHi();
直接man.sayHi();就可以了
这么做的好处就是定义方法的人,跟实现方法的人
可以分离,不需要是同一个人在写
比如张三是领导,我定义了一堆方法
然后就放在那边,找李四来实现,李四就根据这些东西来实现
张三要用这些方法的时候,就不需要等李四实现了再写
马上就可以写了,一般这个时候如果有spring一样的di的话
就可以彻底让张三和李四的工作分离
但是swift我不确定,但是目前至少你可以通过?来做
感觉都是上层建筑,不懂其实也不怎么影响干活
z****e
发帖数: 54598
5
你可以不记住delegation
知道protocol怎么用就行
无意中你就在用delegation鸟
design patterns很多时候你用都不知道自己在用
z****e
发帖数: 54598
6
其实我看swift的意思就是说
你用protocol就是在用delegation这个pattern
你可以不纠结这个了
D***n
发帖数: 6804
7
Delegate技术上说白了就是一种特殊调用函数的方法,和Hook很像。比如普通函数F()
里面运行流程是这样的:
A(); B(); C();
这个很死板,函数ABC预先要写好,编译/链接的时候必须能分别找到B的符号和实现。C
++的扩充思路是继承或者虚方法一类的,这个也必须在运行前就定死。
Delegate的思路是,不直接调用 B(),而是把B改成一个函数指针,平时指向一个特殊
值(比如self/NULL)。
(* B) (void ) = NULL;
上面程序变成
A();
if ( NULL != B) { //这个if可以控制B是must or optional
(*)B(x, y, z);
C();
这样在运行时B可以被动态赋予一个任意的函数指针。只要这个函数满足B希望的参数/
返回类型就可以了(比如参数必须是XYZ)。
在ObjC里,如果一个类型里有很多类似B这样的函数指针,就可以单独列出来形成一个
protocol,任何其他对象函数实现了这个protocol列出来的各种函数interface,再把
自己的地址赋予给B
B = & delegete;
当然在运行时,当运行到B的时候,就可以被调用了。
这方面ObjC比C++传统方法更灵活一些(当然C++也能实现delegate),我在C里面也经
常用delegate,你自己写一个就全明白了。

【在 c******g 的大作中提到】
: 对于protocol基本上明白其用途,只定义属性和方法,不具体实现;当class遵循这个
: protocol的时候才需要提供实现。
: 可是这个delegate还不是很理解。

D***n
发帖数: 6804
8
顺便,配合使用delegate,thread pool,Event loop 加上invoke可以写出很美观的
Async function call以及python类型的duck typing,不需要那些恶心的callback
hell, FP ....

【在 c******g 的大作中提到】
: 对于protocol基本上明白其用途,只定义属性和方法,不具体实现;当class遵循这个
: protocol的时候才需要提供实现。
: 可是这个delegate还不是很理解。

ET
发帖数: 10701
9
你也可以忘记delegate,直接用block
block可以用property一样用。
你确实想了解delegate的话,可以从早期iOS的一个模版了解。
use case:
你需要这么个功能, a 界面列出所有的产品,b界面是个filter窗口,只用来筛选苹果
产品的。
操作逻辑是,用户点a界面上的一个按钮,出现b,选择b上的苹果,b消失,a再现,内
容只有苹果了。
这里有个内容传递过程,b的苹果选择到a界面后更新的过程。
这个实现办法在objetivc-C有很多种,在这几种办法里,delegate是一种比较make
sense的设计办法。
在b设计这个delegate 的protocol,在a中注明,如果是required,a必须执行 - 能起
到让a更新自己数据的功能。
在b中trigger这个protocol 方法,完成b该完成的事情,将选择传递给a
够深入浅出吗?

【在 c******g 的大作中提到】
: 对于protocol基本上明白其用途,只定义属性和方法,不具体实现;当class遵循这个
: protocol的时候才需要提供实现。
: 可是这个delegate还不是很理解。

c******g
发帖数: 4889
10
谢谢楼上各位大牛的讲解!一时间还似懂非懂,我再仔细研究研究。
相关主题
很多有多年经验的Java程序员都会弄错的题目Scala有一点不好
还没被劝退C++的都来看看这个吧C# 的问题, event 这个关键字有什么用?
还是成员函数指针,试试这个诡异的东东吧。问个Winform与工作类的互动问题。
进入Programming版参与讨论
c******g
发帖数: 4889
11
谢谢,讲得很清楚!!

【在 ET 的大作中提到】
: 你也可以忘记delegate,直接用block
: block可以用property一样用。
: 你确实想了解delegate的话,可以从早期iOS的一个模版了解。
: use case:
: 你需要这么个功能, a 界面列出所有的产品,b界面是个filter窗口,只用来筛选苹果
: 产品的。
: 操作逻辑是,用户点a界面上的一个按钮,出现b,选择b上的苹果,b消失,a再现,内
: 容只有苹果了。
: 这里有个内容传递过程,b的苹果选择到a界面后更新的过程。
: 这个实现办法在objetivc-C有很多种,在这几种办法里,delegate是一种比较make

d****i
发帖数: 4809
12
Apple这些做图形界面的东东最早都是从NEXTSTEP被教主带过来的吧,设计思想还是很
不错的,怪不得教主老是说微软的Windows全盘抄袭苹果早年的GUI界面, 比NEXTSTEP更
早的X Window当时还是做的比较简陋的,不如NEXTSTEP的fancy,哪怕后来IBM, HP,
SUN几家合力做UNIX下的图形界面CDE,也是工程师气氛浓而没有NEXTSTEP的艺术家气氛。

【在 ET 的大作中提到】
: 你也可以忘记delegate,直接用block
: block可以用property一样用。
: 你确实想了解delegate的话,可以从早期iOS的一个模版了解。
: use case:
: 你需要这么个功能, a 界面列出所有的产品,b界面是个filter窗口,只用来筛选苹果
: 产品的。
: 操作逻辑是,用户点a界面上的一个按钮,出现b,选择b上的苹果,b消失,a再现,内
: 容只有苹果了。
: 这里有个内容传递过程,b的苹果选择到a界面后更新的过程。
: 这个实现办法在objetivc-C有很多种,在这几种办法里,delegate是一种比较make

g****t
发帖数: 31659
13
oSX 确实牛。傅思涛这些Next里的人确实牛。
不过这个delegate 在C#也早就有了吧。

氛。

【在 d****i 的大作中提到】
: Apple这些做图形界面的东东最早都是从NEXTSTEP被教主带过来的吧,设计思想还是很
: 不错的,怪不得教主老是说微软的Windows全盘抄袭苹果早年的GUI界面, 比NEXTSTEP更
: 早的X Window当时还是做的比较简陋的,不如NEXTSTEP的fancy,哪怕后来IBM, HP,
: SUN几家合力做UNIX下的图形界面CDE,也是工程师气氛浓而没有NEXTSTEP的艺术家气氛。

g****t
发帖数: 31659
14
一个表格类,不规定表格某个cell被tap之后的反应。
只起个名字叫做cell1tap. 然后把这个函数委托给别的对象实现。
这就叫delegate.
这么做好处是明显的。因为cell1tap,之类的具体实现
可以和表格的定义分开,甚至可以runtime再决定。
我觉得其实MS c#文档讲的更清楚。

【在 ET 的大作中提到】
: 你也可以忘记delegate,直接用block
: block可以用property一样用。
: 你确实想了解delegate的话,可以从早期iOS的一个模版了解。
: use case:
: 你需要这么个功能, a 界面列出所有的产品,b界面是个filter窗口,只用来筛选苹果
: 产品的。
: 操作逻辑是,用户点a界面上的一个按钮,出现b,选择b上的苹果,b消失,a再现,内
: 容只有苹果了。
: 这里有个内容传递过程,b的苹果选择到a界面后更新的过程。
: 这个实现办法在objetivc-C有很多种,在这几种办法里,delegate是一种比较make

w********r
发帖数: 1971
15
问这个问题,肯定lz对c++不在行。 大牛的书更有效。代理, c# clr 那本书里有原理
性讲解
。说白了就是抽象一下装13,实际上还是object加一个函数指针
c*********e
发帖数: 16335
16
delegate其实就是让别人给你实现,比如你让旅行社给你去纽约办护照更新,你自己就
不用去了。delegate常用在table view的一个cell的add/udpate,这样delegate是母体
table view,add/update其实是在add/update母体的数据,所以用母体做delegate是很
自然的符合逻辑的设计。

【在 c******g 的大作中提到】
: 对于protocol基本上明白其用途,只定义属性和方法,不具体实现;当class遵循这个
: protocol的时候才需要提供实现。
: 可是这个delegate还不是很理解。

1 (共1页)
进入Programming版参与讨论
相关主题
How many people use design patterns when coding?Question about delegate in C#
IOS APP 开发指南很多有多年经验的Java程序员都会弄错的题目
说道startup,最近这些年最神奇的应该是minecraft了吧?还没被劝退C++的都来看看这个吧
C++ 11问题:emplace_back()还是成员函数指针,试试这个诡异的东东吧。
大牛们对Object C有何点评?Scala有一点不好
问一个.NET与C++的问题C# 的问题, event 这个关键字有什么用?
求支持:在把C++编的cmake转成C#。。问个Winform与工作类的互动问题。
iOS程序开发有前途吗?delegate用中文怎么说?
相关话题的讨论汇总
话题: delegate话题: protocol话题: 实现话题: 深入浅出话题: 方法