• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Lua中类的实现

    概述

         一个类就是像是一个创建对象的模具,对于Lua这种没有类的概念的语言,为了模拟类,方法是为要创建的对象制定一个原型(prototype)。这个原型相当于其他语言中的类。但是原型同时也是一种常规的对象,当其他的对象(看成是原型的实例)遇到一个未知的操作时,就会去原型中查找。因此,在Lua这种没有类的语言中,为了表示一个类,只需创建一个专用作其他对象的原型。类和原型都是一种组织对象间共享行为的方式。本文将在Lua中模拟类,相关的代码可以在我的github上直接运行。

     实现

     在Lua中要模拟类比较关键的地方就是class的继承机制,以及class实例化的过程,这个过程的主要是用了元表技术以及是否把方法拷贝到子类或实例中(若拷贝,则增加了数据冗余,并且丧失了父类更新子类也会自动更新的特性,若不拷贝,则每次访问父类方法,由于使用元表,都会代码额外的开销),下面是一种实现方法:

    clsObject = { 
    __ClassType = "class type" 
    } 
                                                         
    function clsObject:Inherit(o)   
      o = o or {} 
    o.__ClassType = "class type" 
      o.mt = { __index = o} 
      setmetatable(o, {__index = self}) 
      return o 
    end 
     
    function clsObject:New(...) 
      local o = {} 
     
      setmetatable(o, self.mt) 
     
      if o.__init__ then 
        o:__init__(...) 
      end  
      return o 
    end 
     
    function clsObject:__init__() 
    end 
     
    function clsObject:Destroy() 
    end 
     
    function clsObject:GetType() 
      return "BaseClass" 
    end 
    
    

    上面,不管在继承机制还是实例化的过程,都是使用了元表技术,这样做符合class继承的思想。另外还上面的实现,还可以实现工具函数:获取一个class的父类和判断一个class是否是子类或是对象是否改类的实例,代码如下:

    function Super(TmpClass) 
      return getmetatable(TmpClass).__index 
    end 
     
    function IsSub(clsSub, clsAncestor) 
      local Temp = clsSub 
      while 1 do 
        local mt = getmetatable(Temp) 
        if mt then 
          Temp = mt.__index 
          if Temp == clsAncestor then 
            return true 
          end  
        else 
          return false 
        end  
      end  
    end 
    
    

    可以按下面实例代码来使用这个类

    clsParent = clsObject:Inherit() 
     
    function clsParent:Foo() 
      print("ParentFoo!") 
    end 
     
    local ParentObj = clsParent:New() 
    ParentObj:Foo() 
     
     
    clsSon = clsParent:Inherit() 
    function clsSon:Foo() 
      Super(clsSon).Foo(self) 
      print("SonFoo") 
    end 
     
    local SonObj = clsSon:Inherit() 
    SonObj:Foo() 
     
    print(IsSub(clsSon, clsParent)) 
    print(IsSub(clsSon, clsObject)) 
    

    以上所述就是本文的全部内容了,希望能够对大家熟练掌握lua脚本有所帮助。

    您可能感兴趣的文章:
    • Lua中类的实现原理探讨(Lua中实现类的方法)
    • Lua实现类继承
    上一篇:ubuntu 14.04下熟悉lua的语法
    下一篇:Lua中模块以及实现方法指南
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Lua中类的实现 Lua,中类,的,实现,Lua,中类,