跳转至内容

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