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