zz:function/bind的救赎(上)

 

https://blog.csdn.net/myan/article/details/5928531

 

function/bind:泛型的函数指针

应该讲透,讲到回调(callback)、代理(delegate)、信号(signal)和消息传递(messaging)的层面

 

Simula和Smalltalk最重大的不同,就是Simula用方法调用的方式向对象发送消息,而Smalltalk构造了更灵活和更纯粹的消息发送机制。

源自Simula的消息机制称为“静态消息机制”,源自Smalltalk的消息机制称为“动态消息机制”。

具体的说,向一个Simula对象中发送消息,就是调用这个对象的一个方法,或者称成员函数。那么你怎么知道能够在这个对象上调用这个成员函数呢?或者说,你怎么知道能够向这个对象发送某个消息呢?这就要求你必须确保这个对象具有合适的类型,也就是说,你得先知道哦这个对象是什么,才能向它发消息。而消息的实现方式被直接处理为成员函数调用,或虚函数调用。

 

而Smalltalk在这一点上做了一个历史性的跨越,它实现了一个与目标对象无关的消息发送机制,不管那个对象是谁,也不管它是不是能正确的处理一个消息,作为发送消息的对象来说,可以毫无顾忌地抓住一个对象就发消息过去。接到消息的对象,要尝试理解这个消息,并最后调用自己的过程来处理消息。如果这个消息能被处理,那个对象自然会处理好,如果不能被处理,Smalltalk系统会向消息的发送者回传一个doesNotUnderstand消息,予以通知。对象不用关心消息是如何传递给另一个对象的,传递过程被分离出来(而不是像Simula那样明确地被以成员函数调用的方式实现),可以是在内存中复制,也可以是进程间通讯。到了Smalltalk-80时,消息传递甚至可以跨越网络。
 

BS博士:在C语言语法的基础之上,几乎把Simula的思想照搬过来,形成了最初的C++

Brad Cox根据Smalltalk的思想设计了Objective-C --> 乔布斯

 

GUI的本质是对象范型的,最初的GUI开发者硬是用抽象级别更低的语言构造了一个面向对象系统。熟悉Win32 SDK开发的人,应该知道我在说什么。

 

Windows系统中的消息机制实际上是动态的,与C++的静态消息机制根本配合不到一起去

实际上C++的静态消息机制还引起了更深严重的问题——扭曲了人们对面向对象的理解——根本上是方向错了,脱离了对象范式的本质,企图用静态分类法来对现实世界建模,去刻画变化万千的动态世界

 

Java和.NET中分别对C++最大的问题——缺少对象级别的delegate机制做出了自己的回应,这就大大弥补了原来的问题。

 

如果你抱着“对象——消息”的观念去看COM的设计,就会意识到,整个COM体系就是用规范如何做对象,如何发消息的。

 

COM就是用C/C++硬是模拟出一个Smalltalk。而且COM的概念世界里没有继承,就其纯洁性而言,比Smalltalk还Smalltalk。在对象泛型上,COM达到了一个高峰,领先于那个时代,甚至于比它的继任.NET还要纯洁。

COM的主要问题是它的学习难度和安全问题,而且,它过于追求纯洁性,完全放弃了“面向类设计” 的机制,显得有点过。
--------------------- 

 

C++是有一个补救机会的,那就是实现对象级别的delegate机制。

学过.NET的人,一听delegate这个词就知道是什么意思,但Java里没有对应机制。在C++的术语体系里,所谓对象级别delegate,就是一个对象回调机制。通过delegate,一个对象A可以把一个特定工作,比如处理用户的鼠标事件,委托给另一个对象B的一个方法来完成。A不必知道B的名字,也不用知道它的类型,甚至都不需要知道B的存在,只要求B对象具有一个签名正确的方法,就可以通过delegate把工作交给B的这个方法来执行。在C语言里,这个机制是通过函数指针实现的,所以很自然的,在C++里,我们希望通过指向成员函数的指针来解决类似问题。
--------------------- 
 

 

你可能感兴趣的:(zz:function/bind的救赎(上))