ExperimentalGear/scripts/common/class.lua

41 lines
1.1 KiB
Lua
Raw Normal View History

---Declare table as a base class
---@param cls table class table
---@param o table class instance table
---@return table o base class instance table
function Base(cls, o)
cls.__index = cls
o = o or {}
setmetatable(o, cls)
return o
end
local function search(key, bases)
for _, base in ipairs(bases) do
local v = base[key] -- try `i'-th superclass
if v then return v end
end
end
---Declare table as a derived class
---@param cls table class table
---@param o table class instance table
---@param ... table[] base class tables
---@return table o derived class instance table
function Inherit(cls, o, ...)
local nargs = select("#", ...)
local vargs = { select(1, ...) }
cls.__index = cls
if nargs > 1 then
setmetatable(cls, {__index = function(t, k) return search(k, vargs) end})
for _, value in ipairs(vargs) do
o = value:new(o)
end
else
local base = assert(vargs[1], "You must at least specify one class to inherit from.")
setmetatable(cls, {__index = base})
o = base:new(o)
end
setmetatable(o, cls)
return o
end