[阅读: 369] 2005-04-23 17:32:47
假设有n个地方需要调用一个相同的函数(但是有很多条件分支),这个函数根据调用者的不同,选择不同的条件分支执行下去
本来,可以按传给这个函数的参数,来作为分支选择的依据;
但是,这个函数偏偏没有参数!只能依据调用地方的不同来作为分支选择的依据
可以为这n个调用准备n个函数,分别给n个调用地方调不同的:
f1() { caller=1; fcomm(); }
f2() { caller=2; fcomm(); }
...
fn() { caller=n; fcomm(); }
但是,n开发时不能确定,运行时才知道
那么,搞一个元素类型为fcomm类型的函数动态数组,每个元素都设为fcomm,分别给n个调用地方调不同的元素,每个元素的下标就是调用者的编号--好像这样就能解决问题了
其实还是不行:各个调用者按被分配给自己的函数元素调用函数,此时如果比较这个元素的下标,是可以知道的,为了让fcomm知道,需要设一个全局的数值保存这个元素的下标,但是,各个调用者是别人、预先写好的,只能按一个函数指针执行,不允许也不可能去改写各个调用者的调用方式。。。那就是说,虽然使用了函数数组,但是,真正调用的还都是那个fcomm而已,一调用就执行了fcomm,根本没机会告诉fcomm现在的调用者是谁。。。
描述的有点乱,看看下面的背景、原因,也许能清楚一点
这是在考虑pascal script时遇到的技术问题:
即使各种参数类型的事件响应函数我可以按类型分别给出一个它的同类型的函数去替代
但是,真正被调用而运行时,事件响应函数无法知道自己是因为什么操作而被调用的,虽然有self和sender可以确定到哪个Form、哪个控件,但是到底是对这个控件的什么操作--鼠标单击?还是双击?--就无法区分了
除非vcl有其它机制,保存了每次调用事件响应函数时的触发原因(鼠标单击?还是双击?等等)
这个问题,在soap的客户端,应该也存在:客户端要调某个函数,函数的类型完全是xml运行时告诉它的。。。不过好像soap实现起来,这个问题好解决。。。