Blitz Lua 对象接口 |
|
“对象接口”直接将 BlitzMAX 类型映射到相应的 Lua “类”,即一个带有关联元表的表。给定 BlitzMAX 模块的所有类型都驻留在一个 Lua 表中,该表的名称与底层模块相同:例如,在 Lua 中,BlitzMAX 类型 TGadget(位于模块 BRL.MaxGUI 中)由 brl.maxgui.TGadget 复制(其中 brl 是一个全局表)。可选的“import”机制使给定模块的所有类型都成为全局类型,从而无需使用模块名称作为前缀。
命名约定
由于 Lua 是一种区分大小写的语言(而 BlitzMAX 不是),因此以下命名约定适用
如有任何不确定性,请参考包中的类型引用。
参数处理和类型转换
Lua 函数参数等于相应 BlitzMAX 方法的参数,任何默认值都会得到正确尊重(即,相应的 Lua 参数可以是 nil)。类型转换如下
boolean”类型
string”类型
此外,
值得注意的是:“函数接口”将 BlitzMAX 对象作为“轻量级用户数据”传递,而“对象接口”只使用 Lua “对象”。因此,接口实现了一种查找技术,以便为给定的 BlitzMax 对象检索 Lua 表,反之亦然。
_Peer”的字段,该字段包含对底层 BlitzMAX 对象的“引用”(不要修改此字段!)。
因此,传递给 BlitzMAX 函数的是“_Peer”,而从 BlitzMAX 返回的每个对象都会被查找并替换为其关联的 Lua 表(如果存在这样的表,否则会“动态”创建一个新的表)。
任何 BlitzMAX 常量也可以在定义模块所属的表中使用 - 它们的名称保持大写(例如 brl.event.EVENT_WINDOWCLOSE),与 BlitzMAX 中一样。
对象接口的一些细节
接口“类”提供基于原型的差异继承(实际上这意味着,修改“类”会立即影响其所有实例,除非修改的字段被实例“遮蔽”)。此外,它们还管理其“_Peer”的生命周期:使用“守护者”(参见 BlitzLuaKeeper),每个 Lua “对象”都会在垃圾收集器将其从内存中删除时收到通知。然后它会调用其 destroy 方法,该方法会正确关闭并删除关联的 BlitzMAX 对等体。
当同时使用“函数接口”和“对象接口”时,你不应该混合使用操作 BlitzMAX 对象的函数和 Lua “方法”,除非你真的知道自己在做什么。但是,使用其他函数(不处理特定对象)是安全的(而且通常是必要的)。
与“函数接口”相比,“对象接口”允许使用面向对象的表示法,并使程序员免于自己管理 BlitzMAX 对象的负担。
“对象接口”尚未完成,但有望在 2007 年 5 月 18 日左右发布。