Lua 通过元表可以实现面向对象。当然,这种面向对象并不是真的面向对象,而是类似于一种原型模式,从一个已有的table中clone出另一个table。Lua自身是不支持面向对象的。本文来写一个简单的Lua面向对象实现。
local class_mt = {}
-- class_mt.__index = function(self, key) 也可以
function class_mt:__index(key)
return self.__baseclass[key]
end
class = setmetatable({ __baseclass = {} }, class_mt)
function class:new(...)
local c = {}
c.__baseclass = self --每一个新类的baseclass都是class,调用new的时候会去找class的new。
setmetatable(c, getmetatable(self))
if c.init then
c:init(...)
end
return c
end
上面的代码就是一个简单的面向对象实现。外部接口是class:new() 。在这个函数里面,我们创建了一个table,是我们的目标,然后给这个table设置元表为class这个table的元表,而class的元表是class_mt,也就是说,我们新类的元表是class_mt,然后调用init()方法来初始化,这是我们的构造函数。使用方法如下:
Mass = class:new()
function Mass:init(x, y)