原文出处: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 2print(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
继承和多态部分详见: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,y,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.y,self.z) end测试代码如下:
c = Main:new(20,40,100) c:test() d = Main:new(10,50,200) d:go() d:plus() d:test() c:test()
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,y,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.y,self.z) end
测试代码如下:
a = Class:new(10,20) print(a:gio()) d = Main:new(10,50,200) print(d:gio()) print(a:gio())