2022-04-03 19:43:50 +02:00
|
|
|
---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
|
|
|
|
|
2022-04-11 18:47:26 +02:00
|
|
|
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
|
|
|
|
|
2022-04-03 19:43:50 +02:00
|
|
|
---Declare table as a derived class
|
|
|
|
---@param cls table class table
|
|
|
|
---@param o table class instance table
|
2022-04-11 18:47:26 +02:00
|
|
|
---@param ... table[] base class tables
|
2022-04-03 19:43:50 +02:00
|
|
|
---@return table o derived class instance table
|
2022-04-11 18:47:26 +02:00
|
|
|
function Inherit(cls, o, ...)
|
|
|
|
local nargs = select("#", ...)
|
|
|
|
local vargs = { select(1, ...) }
|
2022-04-03 19:43:50 +02:00
|
|
|
cls.__index = cls
|
2022-04-11 18:47:26 +02:00
|
|
|
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
|
2022-04-03 19:43:50 +02:00
|
|
|
setmetatable(o, cls)
|
|
|
|
return o
|
2022-04-11 18:47:26 +02:00
|
|
|
end
|