Lua面向对象程序设计 · 花生肉泥
类
lua不存在类的概念,每个对象定义他自己的行为并拥有自己的形状(shape)。然而,依据基于原型的语言,在lua中仿效类的概念并不难。
在lua中,使用继承的思想,很容易实现prototype(原型),如果我们有两个对象a和b,我们想让b作为a的原型,只需要
1 | setmetatable(a,{__index = b}) |
这样,对象a调用任何不存在的成员函数都会到对象b中去找,术语上,可以将b看做类,a看做对象。
例:为了使得新创建的对象拥有和Account相似的行为。我们使用__index metamethod,使新的对象继承Account,注意一个小小的优化,我们不需要创建一个额外的表作为account对象的metatable,我们可以用Account表本身作为metatable
1 | function (o) |
当我们调用Account:new时,self等于Account,因此可以直接使用Account取代self。有了这段代码之后,当我们创建一个新的账号并且用掉一个方法的时候:
1 | a = Account:new{balance = 0} |