模拟超越函式 (simulated efunctions (simul_efuns) )

mudlib  可以撰写模拟的超越函式 (efunction). 所有模拟的超越函式必须定义在
一个特殊的档案中 (此档案的名称及目录位置定义在 config.example 中)  (译按
: config.example 为一个示□档案, 是启动 driver  程式时必须读取的 mud  组
态档. 手上有 ES 2 mudlib 的人, 可以在 es2/adm/etc 目录中找到 config.ES2
这个档案. 有 MudOS v21c2 原始码的人, 在 MudOS_v21c2/src 目录中可以找到
config.example) . 

编译一个物件时, 发现一个函式呼叫 (非 call_other 呼叫) 在物件中没有定义过,
也不是一个超越函式时, 则驱动程式会寻找模拟超越函式的名单, 看看此函式呼叫
是否为模拟超越函式. 如果名单上有此函式, 则驱动程式就以 call_other 的方式
呼叫此函式 (定义在模拟超越函式档案里面).  请注意, call_other  的传回结果
不需要事先定型 (typecast),  因为编译器会自动设定其型态.

模拟超越函式有许多用途. 其中一个是修改超越函式的作用 (甚至取消其作用),
却不需要修改驱动程式 (只需要把模拟超越函式取名为相同的超越函式即可).  假
设您想修改 move_object()  超越函式, 您可以定义一个同名的模拟超越函式. 这
个也叫做 move_object()  的模拟超越函式可以用来检查不同的条件限制, 然後再
呼叫 efun::move_object(). efun::  这个前置词一定要加上去, 驱动程式才知道
您想呼叫原来的 move_object()  超越函式, 而不是重覆呼叫一次模拟的
move_object().  (请注意, master.c 里的 valid_override() 可以用来控制 
efun::  到底可以对哪一个模拟超越函式越权 (override).  模拟超越函式也可以
加上一些函式, 这些函式也许有许多物件需要呼叫它们, 却不适合放在一个继承物
件的档案中.

所有在模拟超越函式档案中, 宣告为静态 (static) 的函式, 不能从模拟超越函式
档案以外去呼叫它.

翻译: Spock @ FF	97.Aug.9.
