当前位置 博文首页 > Lua中类的实现

    Lua中类的实现

    作者:admin 时间:2021-02-12 21:02

    概述

         一个类就是像是一个创建对象的模具,对于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脚本有所帮助。

    js
    下一篇:没有了