找回密码
 立即注册
查看: 241|回复: 0

xlua 面向对象

[复制链接]
发表于 2023-4-9 19:16 | 显示全部楼层 |阅读模式
  1. --[[-- Lua面向对象设计
  2. --]]--保存类类型的虚表
  3. local _class ={}
  4. local _className ={}
  5. ClassType ={
  6.         class =1,
  7.         instance =2,}
  8. function BaseClass(classname, super)assert(type(classname)=="string" and #classname >0)-- 生成一个类类型
  9.         local class_type ={}-- 在创建对象的时候自动调用
  10.         class_type.__init = false
  11.         class_type.__delete = false
  12.         class_type.__cname = classname
  13.         class_type.__ctype = ClassType.class
  14.        
  15.         class_type.super = super
  16.         class_type.New =function(...)-- 生成一个类对象
  17.                 local obj ={}
  18.                 obj._class_type = class_type
  19.                 obj.__ctype = ClassType.instance
  20.                
  21.                 -- 在初始化之前注册基类方法
  22.                 setmetatable(obj,{
  23.                         __index = _class[class_type],})-- 调用初始化方法
  24.                 do
  25.                         local create
  26.                         create =function(c,...)if c.super then
  27.                                         create(c.super,...)
  28.                                 end
  29.                                 if c.__init then
  30.                                         c.__init(obj,...)
  31.                                 end                               
  32.                         end
  33.                         create(class_type,...)
  34.                 end
  35.                 -- 注册一个delete方法
  36.                 obj.Delete =function(self)if self.__isDeleted then
  37.                                 Logger.LogError(string.format("Trying to delete object which was already deleted. %s", table.dump(self)));return;
  38.                         end
  39.                         if(DebugManager ~= nil and DebugManager:LogDeleteCall())then
  40.                                 Logger.Log(" Delete self : "..tostring(self).."\n"..truncate(table.dump(self),1024))
  41.                         end                       
  42.                         self.__isDeleting = true;
  43.                         local now_super = self._class_type
  44.                         while now_super ~= nil doif now_super.__delete then
  45.                                         now_super.__delete(self)
  46.                                 end
  47.                                 now_super = now_super.super
  48.                         end
  49.                         self.__isDeleting = nil;
  50.                         self.__isDeleted = true;
  51.                 end
  52.                 obj.GetClassType =function(self)return self._class_type;
  53.                 end
  54.                 obj.IsAlive =function(self)return not self:IsDeleting() and not self:IsDeleted();
  55.                 end
  56.                 obj.IsDeleting =function(self)return self.__isDeleting;
  57.                 end
  58.                 obj.IsDeleted =function(self)return self.__isDeleted;
  59.                 end
  60.                 if(DebugManager ~= nil and DebugManager:LogCreateCall())then
  61.                         Logger.Log(" Create : "..tostring(obj).."\n"..truncate(table.dump(obj),1024))
  62.                 end
  63.                 return obj
  64.         end
  65.         local vtbl ={}assert(_class[class_type]== nil,"Aready defined class : ", classname)
  66.         _class[class_type]= vtbl
  67.         _className[classname]= class_type
  68.         setmetatable(class_type,{
  69.                 __newindex =function(t,k,v)
  70.                         vtbl[k]= v
  71.                 end
  72.                 ,--For call parent method
  73.                 __index = vtbl,})if super then
  74.                 setmetatable(vtbl,{
  75.                         __index =function(t,k)
  76.                                 local ret = _class[super][k]--do not do accept, make hot update work right!--vtbl[k]= ret
  77.                                 return ret
  78.                         end
  79.                 })
  80.         end
  81.         return class_type
  82. end
  83. function Class(className)return _className[className];
  84. end
复制代码
当你需要继承的时候可以使用
  1. local UIOperateTipPanel =BaseClass("UIOperateTipPanel", UIBaseView)
复制代码
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-22 22:33 , Processed in 0.129961 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表