是的,可以向现有的导出类添加新方法。
Foobar 只是一个普通的表,因此您可以像在任何其他表上一样在其上附加方法。 [1]
Foobar["extra_method"] = function (self, arg1, arg2) print(arg1, arg2) end
现在你可以这样做了:
Foobar:extra_method(1,2)
将显示1 2。
[1] tolua++ 的工作有点奇怪。它为每个类创建一个主表,这就是你所看到的 Foobar,它包含类的静态成员函数(例如Foobar:new())和类的实例成员函数(例如Foobar:method1() 可能是什么)。 lua 中的: 运算符是语法糖; a:b() 转换为 a.b(a)。这意味着当您调用Foobar:new() 时,它会转置为Foobar:new(Foobar),因此self 参数就是Foobar 表。当您创建 Foobar 类型的对象,然后对其调用 method1() 时,self 将成为该对象。因此,向 Foobar 表添加一个新方法 method3 将允许您执行 Foobar:method3() 和 obj = Foobar:new(); obj:method3(),尽管前者会出错。因此,此答案仅适用于 tolua++。
编辑:解决评论
让我在这里使用实际代码。因此,假设我们有一个 Foobar 的类声明,如下所示:
class Foobar {
public:
void method1();
static void method2();
};
当 tolua++ 为这个类生成 lua 绑定代码时,它会给你一个包含以下方法的表
- new() - 调用
Foobar:new() 以创建 Foobar 的实例。
- delete() - 调用
instance:delete() 来销毁 Foobar 的一个实例。
- method1() - 调用
instance:method1() 以在实例上运行 method1。
- method2() - 调用
Foobar:method2() 来运行 method2。
但是,tolua++ 实际上并没有使用两个不同的表(一个用于应该附加到类本身的方法,一个用于该类实例的方法)。相反,它将两者合并在一起,因此可以运行 Foobar:method1() 和 instance:new()... 即使这不是应该使用这些方法的方式。因此,如何使用静态方法和如何使用实例方法之间没有区别。从语法上讲,它也是一样的。 (我个人觉得这是tolua++的问题。)
如果你正在寻找一个例子,下面是你应该如何在 lua 中调用这些函数:
obj = Foobar:new()
print( obj:method1() )
obj:delete()