Lua 实现继承的一种方式
以下代码来自Loxodon Framework,截取自其中的一段
function class(classname, super)
local cls = {}
cls.__classname = classname
cls.__class = cls
cls.base = function (self)
return cls.super
end
cls.__type = 0
cls.super = super
cls.__index = cls
if super then
setmetatable(cls,{__index = super, __call = function (t,...)
local instance = setmetatable({},t)
instance:ctor(...)
return instance
end})
else
cls.ctor = function (...)
end
setmetatable(cls,{__call = function (t,...)
local instance = setmetatable({},t)
instance:ctor(...)
return instance
end})
end
if not cls.ctor then
cls.ctor = function (...) --构造函数
end
end
return cls
end
调用方式
local t = {1,2,3}
t.age = 10
local a = class("a",t)
print(a.age) --输出10
local b = a() --调用了__call元方法,相当于是构造函数
print(b.age) --输出10
当调用a.age时,a相当于cls,会从__index中寻找age,即super,也就是t中寻找
而当通过local b = a() 的方式调用时,会进入到__call元方法中,instance 会从cls继承,相当于把cls设置为了instance的元表,最终返回instance