Lua 面向对象编程
类
请看文件名为 的源码:
上面这段代码 “setmetatable({balance = balance}, mt)”,其中 mt 代表 ,这句话值得注意。根据我们在元表这一章学到的知识,我们明白,setmetatable 将 作为新建表的原型,所以在自己的表内找不到 ‘deposit’、’withdraw’ 这些方法和变量的时候,便会到 __index 所指定的 _M 类型中去寻找。
继承
成员私有性
在动态语言中引入成员私有性并没有太大的必要,反而会显著增加运行时的开销,毕竟这种检查无法像许多静态语言那样在编译期完成。下面的技巧把对象作为各方法的 upvalue,本身是很巧妙的,但会让子类继承变得困难,同时构造函数动态创建了函数,会导致构造函数无法被 JIT 编译。