Lua的类实现继承、多态以及setmetatable方法
发布时间:2020-12-14 22:05:05 所属栏目:大数据 来源:网络整理
导读:原文出处:http://blog.csdn.net/ym012/article/details/7206968 1,Lua类实现 从网上搜了几个类实现,自己照猫画老虎的弄个如下: ClassYM = {x=0,y=0} --这句是重定义元表的索引,必须要有, ClassYM.__index = ClassYM --模拟构造体,一般名称为new() fun
原文出处:http://blog.csdn.net/ym012/article/details/7206968 1,Lua类实现 从网上搜了几个类实现,自己照猫画老虎的弄个如下: ClassYM = {x=0,y=0} --这句是重定义元表的索引,必须要有, ClassYM.__index = ClassYM --模拟构造体,一般名称为new() function ClassYM:new(x,y) local self = {} setmetatable(self,ClassYM) --必须要有 self.x = x self.y = y return self end function ClassYM:test() print(self.x,self.y) end objA = ClassYM:new(1,2) objA:test() print(objA.x,objA.y) 运行结果如下: 1 21 2 print(objA:x,objA:y)会报错,调用ojbA.test也会报错,W? 调用 objA = ClassYM:new(1,2) objA = ClassYM:new(1,2)再调用objA.test()时结果如下: 2 0 如调用 objA = ClassYM:new(self,1,2) 再调用objA.test()时结果如下: 1 2
lua提供了用冒号的方式在一个方法定义中添加一个额外的参数,这个参数就是self,这句话可以不理解,但是要劳记!
继承和多态部分详见:http://www.soyomaker.com/forum.php?mod=viewthread&tid=230 2,继承 首先,类的定义 --声明了新的属性Z Main = {z=0} --设置类型是Class setmetatable(Main,Class) --还是和类定义一样,表索引设定为自身 Main.__index = Main --这里是构造体,看,加上了一个新的参数 function Main:new(x,z) local self = {} --初始化对象自身 self = Class:new(x,y) --将对象自身设定为父类,这个语句相当于其他语言的super setmetatable(self,Main) --将对象自身元表设定为Main类 self.z= z --新的属性初始化,如果没有将会按照声明=0 return self end --定义一个新的方法 function Main:go() self.x = self.x + 10 end --重定义父类的方法 function Main:test() print(self.x,self.z) end测试代码如下: c = Main:new(20,100) c:test() d = Main:new(10,200) d:go() d:plus() d:test() c:test() 3,多态 Class = {x=0,y=0} Class.__index = Class function Class:new(x,y) local self = {} setmetatable(self,Class) self.x = x self.y = y return self end function Class:test() print(self.x,self.y) end --新定义的一个函数gto() function Class:gto() return 100 end --这里会引用gto() function Class:gio() return self:gto() * 2 end function Class:plus() self.x = self.x + 1 self.y = self.y + 1 end 再者,继承部分代码如下: Main = {z=0} setmetatable(Main,Class) Main.__index = Main function Main:new(x,z) local self = {} self = Class:new(x,y) setmetatable(self,Main) self.z= z return self end --重新定义了gto() function Main:gto() return 50 end function Main:go() self.x = self.x + 10 end function Main:test() print(self.x,self.z) end 测试代码如下: a = Class:new(10,20) print(a:gio()) d = Main:new(10,200) print(d:gio()) print(a:gio())具体结果大家可以自己试试看!? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |