Lua中类的实现
技术  /  管理员 发布于 5年前   516
概述
一个类就是像是一个创建对象的模具,对于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脚本有所帮助。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号