30. 重启,引擎,三分钟热度
3.26,看不懂,算了吧,学别的,bytepath 也学不进去。
OOP mixins
lua
class = {}
class.__index = class
function class:new() end
function class:class_new(...)
local c = {} -- 新建一个空表当“类对象”
c.__is = {}
c.__is[c] = true -- 记录“自己是自己这个类”,后面 class_is 会用
c.__index = c -- 以后实例的 __index 指向这个类表(实例找不到字段就从类上找)
c.__class = c -- 保存一下“自己的类是谁”(这里就是自己)
setmetatable(c, self) -- 把这个新类 c 的元表设成父类 self(这样 c() 时会触发 class:__call 来构造实例)
c:class_add(...) -- 把传进来的所有 mixin 类的方法拷贝到 c 上
return c
end
function class:class_add(...)
local mixins = { ... }
for _, mixin in ipairs(mixins) do
self.__is[mixin] = true
for k, v in pairs(mixin) do
if k ~= 'new' and not k:find('__') then
if self[k] then
error('collision on function or attribute name "' .. k .. '"')
elseif self[k] == nil and type(v) == 'function' then
self[k] = v
end
end
end
end
end
function class:class_is(c)
return self.__is[c]
end
function class:__call(...)
local instance = setmetatable({}, self)
if main then instance.id = main:random_uid() else instance.id = 0 end
instance:new(...)
return instance
end