Public Class Class1
'什么是叫委托,委托的意义和作用。
'委托概念的产生原因是因为分别出现了代码的设计者和使用者的关系。
'因为这种设计者与使用者的关系的原因,就出现了代码的设计者一系列预定义问题。
'代码的设计者设计阶段有一个面临实现关键核心功能具体化问题,主要是代码的设计者并不知道代码的使用者具体要求什么样的功能。
'因为,代码的设计者来说代码的使用者需要的功能可能是几百种甚至几千种都可能!!!
'这就是代码的设计者设计阶段面临的最头疼的问题。
'微软长期挖苦中突然闪亮了一对双眼金睛,从那双眼金睛中使劲儿拉出来了委托字样和模式。
'大家请继续保持精神!因为,本大魔王正在破旧的餐桌上演讲呢
'委托的第一的作用;
'举一个Task任务类型的对象来说明问题吧!
'Task对象是由微软设计出来的,美利坚合众国微软是代码的设计者。
'Task对象创建过程中分为可预知的部分和不可预知的部分组成。
'代码的设计者在设计阶段可预知的部分是由代码的设计者自己预定义完成相关功能,例如;Start,Wait,Result等等众多可预知功能。
'但是,代码的设计者不可预知的部分是什么呢???
'因为,Task对象是属于线程操作类型的。但是代码的设计者并不知道代码的使用者在此Task上具体需要实现什么样的功能,
'这就是代码的设计者设计阶段面临的得了感冒一般头疼的问题。
'上面已经提到,美国微软已经发明了<委托>。现在已经是派上用场的时候了!!!
'代码的设计者在设计阶段不可预知的部分直接委托给代码的使用者,使代码的使用者自己定义实现具体功能。
'同时,代码的设计者并不需要关心代码的使用者具体需要什么样的功能了。
'如果,没有委托那怎样了? 其结果是每个用户的使用者可能需要的功能上达几百种甚至几千种更是天文数字啊!!!
'这样的状态下代码的设计者永远无法做到满足,代码的使用者也无法使用如此繁多的功能列表上查找使用!
'有了委托就解决了如上的所有难题。
'委托的第二作用;
'本大魔王举一个最简单的小学一年级加减乘除+-*/来讲课。
Private Function MyFunc1(ByVal Math1 As Integer) As Integer
Const Val1 As Integer = 20
Return Val1 + Math1
End Function
Private Function MyFunc2(ByVal Math1 As Integer) As Integer
Const Val1 As Integer = 20
Return Val1 - Math1
End Function
Private Function MyFunc3(ByVal Math1 As Integer) As Integer
Const Val1 As Integer = 20
Return Val1 * Math1
End Function
Private Function MyFunc4(ByVal Math1 As Integer) As Integer
Const Val1 As Integer = 20
Return Val1 / Math1
End Function
'请看上面定义的四个函数,实现加减乘除功能使用了四个函数。
'如果,在公共函数中代码的设计者如此这样模式设计,vb.net的函数列表中能看到无法承受的庞大的函数纵队!!!
'估计本大魔王也用不了!
'这时候委托该派上用场了!!!
'请看下面代码的设计者设计的一个函数。
'这个函数使用了委托,代码的使用者凭借这样设计的唯一一个函数,都能自定义实现加减乘除4个功能!!!
Private Function MyFunc(ByVal Math1 As Integer, ByVal Func1 As Func(Of Integer, Integer, Integer)) As Integer
Const Val1 As Integer = 20
Return Func1.Invoke(Val1, Math1)
End Function
'代码的使用者使用过程中自定义实现功能。
'具体如下;
Sub MySub()
Dim Result1 As Integer
'代码的使用者自定义实现加法功能;
Result1 = MyFunc(5, Function(a As Integer, b As Integer) a + b)
'代码的使用者自定义实现减法功能;
Result1 = MyFunc(5, Function(a As Integer, b As Integer) a - b)
'代码的使用者自定义实现乘法功能;
Result1 = MyFunc(5, Function(a As Integer, b As Integer) a * b)
'代码的使用者自定义实现除法功能;
Result1 = MyFunc(5, Function(a As Integer, b As Integer) a / b)
End Sub
'委托的第三作用;
'这个大家自己寻找答案吧! 免费已经足够了!!!
'本大魔王继续演讲委托的类型问题。
'委托本身具有委托类型,代码的设计者通过声明委托,然后使用者实例化实现自定义功能。
'委托类型是lambda表达式类型的。所以,只能用Sub,Function这2种类型的。
'使用环境不同出现了2种类型的实例化委托方式,就是lambda表达式和AddressOf这2种类型来实例化委托。
'其中AddressOf关键字只用来引用带名称的Sub或Function时使用。lambda表达式则直接在委托上实例化。
'所以,本大魔王的结论是委托实质是Sub或Function的抽象。代码的设计者不可预知的部分委托给使用者,而且代码的设计者只是做了Sub或Function的抽象。
'代码的使用者使用阶段具体化Sub或Function,代码的使用者由此梦想成真自定义实现具体功能。
'我的小魔王出来鼓掌一下,激发本大魔王威力无比的智慧!
'最后强调本大魔王是一个大家认识的高丽棒子!
'网上忽悠概念的人实在是太多。
'有人说委托是安全类型的指针函数,又有人说委托是委托给别人结果带回来等等让人苦笑不得的局面层出不穷。
'
End Class