概述
一个类就是像是一个创建对象的模具,对于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实现类
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?