lua中的面向对象模拟,类、继承、多态
test1.lua
1 --这里声明了类名,并且给出了属性的初始值 2 Class = {x=0,y=0} 3 --这句话是冲定义元表的索引,就是说有了这句,这才是一个类 4 Class.__index=Class 5 --构造体 6 function Class:new(x,y) 7 local self={}--初始化self,如果没有这句,那么类所建立的对象改变,其他对象都回改变 8 setmetatable(self,Class)--将self的元表设定为Class 9 self.x=x--属性初始值 10 self.y=y 11 return self--返回自身 12 end 13 --设定类的其他方法 14 function Class:test() 15 print(self.x,self.y) 16 end 17 18 function Class:plus() 19 self.x=self.x+1 20 self.y=self.y+1 21 end 22 23 function Class:gto() 24 return 100 25 end 26 27 function Class:gio() 28 return self:gto()*2 29 end
test2.lua
1 require "test1" 2 --声明了新的属性Z 3 Main = {z=0} 4 --设置类型是Class 5 setmetatable(Main,Class) 6 --还是和类定义一样,表索引设定为自身 7 Main.__index=Main 8 --这里是构造体,看,加上了一个新的参数 9 function Main:new(x,y,z) 10 local self={}--初始化对象自身 11 self=Class:new(x,y)--将对象自身设定为父类,这个语句相当于其他语言的super 12 setmetatable(self,Main)--将对象自身元表设定为Main类 13 self.z=z--新的属性初始化,如果没有将会按照声明=0 14 return self 15 end 16 --定义一个新的方法 17 function Main:go() 18 self.x=self.x+10 19 end 20 --重定义父类的方法 21 function Main:test() 22 print(self.x,self.y,self.z) 23 end 24 --重新定义了gto() 25 function Main:gto() 26 return 50 27 end 28 29 a=Class:new(10,20) 30 print(a:gio()) 31 b=Main:new(10,50,200) 32 print(b:gio()) 33 print(a:gio())
输出的结果是:
200
100
200