委托应该用到哪些地方,解决哪些问题。

please_call_me_J 2010-05-27 12:30:47
我学了委托怎么一直用不上呢?到底在哪些情况下不用委托解决不了问题?希望有人能举一个通俗简单的例子来告诉我,如果有简单明了的代码来解释就更感谢各位了。
...全文
98 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
please_call_me_J 2010-06-02
  • 打赏
  • 举报
回复
虽然VC的链表不懂,但看了阁下的言论,我好像有一点懂你的意思了。一直都听说指针的不当操作会带来很多后果,当一直没能真正的去理解到。
兔子-顾问 2010-05-28
  • 打赏
  • 举报
回复
而且是安全的。为什么说安全呢,04年接触c#时候总有人说是安全的但也没人说出原因。我现在觉得,这个安全主要是委托的引用一定指向一个此签名的方法,而c++的函数指针有可能指向任意地址(因为是指针了,就有很多方法来修改指针的值来指向其他地址)。所以委托是安全的,是具有链表形式可以广播通知的,比函数指针功能强大。
兔子-顾问 2010-05-28
  • 打赏
  • 举报
回复
委托和函数指针不同的。
虽然有点像
但你要知道,委托都是多播委托,广播形式的,相当于c++函数指针的链表。
please_call_me_J 2010-05-28
  • 打赏
  • 举报
回复
委派就是VC里的函数指针,传的是过程地址嘛,addressof从字面理解不就是指向某个地址吗?概念我还是知道,只是很多时候都没用上。

再次感谢wuyazhe前辈的通俗易懂的例子。谢谢
大刘0417 2010-05-28
  • 打赏
  • 举报
回复
到现在我还没有用到,不过我知道委托就是传递一个过程或函数,就像有时需要向函数传递参数一样!
兔子-顾问 2010-05-27
  • 打赏
  • 举报
回复
委托。你可以用invoke,也可以不用。
你的1,2,两个问题,说明你理解的没错。但是我写的都是简化写法。而且没用编译器,如果不通过就加上addressof,如果能编译通过。那就用简化写法即可。编译后的结果一样。
please_call_me_J 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyazhe 的回复:]
VB.NET code
'吧方法当参数传递时候就要用委托了。
'比如,我喊你吃饭
class george
inherits man
end class

public sub 喊吃饭(byval m as man , juyangjia obj)
end sub

'于是我程序里某处写:
sub DoSomething()
dim g as new geo……
[/Quote]

首先感谢各位网友前辈对本帖的关注,谢谢。

最后问下 wuyazhe 前辈2个问题,
第1个问题:dim things() as DoWith = {喊吃饭,喊喝汤,喊收拾桌子,喊洗碗}
其次是这句就相当于书上的例题里的addressof xxx指向4个过程吗?然后把函数指针数组传给那个委派实现过程,然后遍历分别实现。

第2个问题:thing(g,someone)
这句实现?为什么不是thing.invoke(g,someone) ?不用INVOKE实现也可以吗?

hztltgg 2010-05-27
  • 打赏
  • 举报
回复
你的事件类型不都是委托呀。
在以前一般用在你先写高层代码,然后写底层代码的时候用,就像接口的关系一样,因为底层还没实现,所以只定义了一个参数和返回值的东西

在现在还可以用在函数式编程的风格上,可以让你少写代码
shqdb888 2010-05-27
  • 打赏
  • 举报
回复
学习~~~~~~~~~~~~~~~~~~~~
a854468521 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyazhe 的回复:]
VB.NET code
'吧方法当参数传递时候就要用委托了。
'比如,我喊你吃饭
class george
inherits man
public sub 喊吃饭(juyangjia obj)
end sub
end class

'于是我程序里某处写:
sub DoSomething()
dim g as new george
di……
[/Quote]
通俗、易懂,支持。
兔子-顾问 2010-05-27
  • 打赏
  • 举报
回复
'吧方法当参数传递时候就要用委托了。
'比如,我喊你吃饭
class george
inherits man
end class

public sub 喊吃饭(byval m as man , juyangjia obj)
end sub

'于是我程序里某处写:
sub DoSomething()
dim g as new george
dim j as new juyangjia
喊吃饭(g,j)
end sub

'然后我还要喊你洗碗,喊你擦嘴
class juyangjia
inherits man
end class

'于是我要吧刚才的方法扩展出来
sub DoSomething()
dim g as new george
dim j as new juyangjia
喊吃饭(g,j)
喊擦嘴(g,j)
喊洗碗(g,j)
end sub

'但是我发现这个方法写好后,可能会修改,于是我尝试吧相同的写在一起,比如类似的,喊吃饭,喊洗完,等操作都是一个参数man,没有返回值。那我就定义委托
public delegate sub DoWith(byval m as man,byval m1 as man)

我刚才的方法就可以修改为:

sub DoSomething(byval things as DoWith(),byval someone as man)
dim g as new george
for each thing as DoWith in things
thing(g,someone)
next
end sub


这个方法的2个参数就可以被配置了。方法就作为参数传递给DoSomething了。
我可以很方便的扩充这个方法
dim things() as DoWith = {喊吃饭,喊喝汤,喊收拾桌子,喊洗碗}
DoSomething(things,new juyangjia())

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧