原始实现
源代码地址http://www.lua.org/pil/16.2.html
我做了些许改变,代码如下:
Account.lua文件
1 | Account = {balance = 0} |
SpecialAccount.lua文件
1 | SpecialAccount = Account:new() |
入口文件
1 | require("Account") |
输出结果:
1 | 你没那么多钱 取不出来的 兄弟 |
分析
OOP核心部分实现代码就是这块:
1 | function Account:new (o) |
直接去除语法糖,更换变量名 将上面代码 等效 转化为 如下代码:
1 |
|
如果你对为何能等效转换及2B情景法有疑问,请看我之前的文章: Lua从入门到入了门(2) 基础难点概述
然后让我用2B情景法翻译一下上面那段
_newTable
就是小弟,_firstArg
也就是调用时候传入的Account
就是大哥
setmetatable(_newTable, _firstArg)
让小弟认了大哥
_firstArg.__index = _firstArg
大哥偷懒,直接将查找函数指向了自己,(参考之前例子中GreenPaper)
然后直接return 了小弟, 小弟就可以自己去愉快的玩耍了.
小结
教科书给出的OOP模拟方式是最好理解的,但是相应的会在编写上稍显复杂. 比如 SpecialAccount
声明时候要去写 SpecialAccount = Account:new()
所以这个例子更多的是教学意义大于实际意义