acecase 发表于 2023-4-9 19:16

xlua 面向对象

--[[-- Lua面向对象设计
--]]--保存类类型的虚表
local _class ={}
local _className ={}

ClassType ={
        class =1,
        instance =2,}

function BaseClass(classname, super)assert(type(classname)=="string" and #classname >0)-- 生成一个类类型
        local class_type ={}-- 在创建对象的时候自动调用
        class_type.__init = false
        class_type.__delete = false
        class_type.__cname = classname
        class_type.__ctype = ClassType.class
       
        class_type.super = super
        class_type.New =function(...)-- 生成一个类对象
                local obj ={}
                obj._class_type = class_type
                obj.__ctype = ClassType.instance
               
                -- 在初始化之前注册基类方法
                setmetatable(obj,{
                        __index = _class,})-- 调用初始化方法
                do
                        local create
                        create =function(c,...)if c.super then
                                        create(c.super,...)
                                end
                                if c.__init then
                                        c.__init(obj,...)
                                end                               
                        end
                        create(class_type,...)
                end

                -- 注册一个delete方法
                obj.Delete =function(self)if self.__isDeleted then
                                Logger.LogError(string.format("Trying to delete object which was already deleted. %s", table.dump(self)));return;
                        end
                        if(DebugManager ~= nil and DebugManager:LogDeleteCall())then
                                Logger.Log(" Delete self : "..tostring(self).."\n"..truncate(table.dump(self),1024))
                        end                       
                        self.__isDeleting = true;
                        local now_super = self._class_type
                        while now_super ~= nil doif now_super.__delete then
                                        now_super.__delete(self)
                                end
                                now_super = now_super.super
                        end
                        self.__isDeleting = nil;
                        self.__isDeleted = true;
                end
                obj.GetClassType =function(self)return self._class_type;
                end
                obj.IsAlive =function(self)return not self:IsDeleting() and not self:IsDeleted();
                end
                obj.IsDeleting =function(self)return self.__isDeleting;
                end
                obj.IsDeleted =function(self)return self.__isDeleted;
                end
                if(DebugManager ~= nil and DebugManager:LogCreateCall())then
                        Logger.Log(" Create : "..tostring(obj).."\n"..truncate(table.dump(obj),1024))
                end
                return obj
        end

        local vtbl ={}assert(_class== nil,"Aready defined class : ", classname)
        _class= vtbl
        _className= class_type

        setmetatable(class_type,{
                __newindex =function(t,k,v)
                        vtbl= v
                end
                ,--For call parent method
                __index = vtbl,})if super then
                setmetatable(vtbl,{
                        __index =function(t,k)
                                local ret = _class--do not do accept, make hot update work right!--vtbl= ret
                                return ret
                        end
                })
        end

        return class_type
end

function Class(className)return _className;
end当你需要继承的时候可以使用
local UIOperateTipPanel =BaseClass("UIOperateTipPanel", UIBaseView)
页: [1]
查看完整版本: xlua 面向对象