首页 > 开发 > 综合 > 正文

Lua中类的实现

2024-07-21 23:04:26
字体:
来源:转载
供稿:网友

概述

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表