Lua 中模拟 类

来源:互联网 发布:linux改用户权限 编辑:程序博客网 时间:2024/04/29 01:47


LUA类
类一般都有类名,属性声明,构造体,方法,属性。下面用LUA实现类的模拟,类的模拟有很多种,但是都必须用到__index

下面看看代码吧

--声明了类名还有属性,并且给出了属性的初始值。Class = {x = 0, y = 0}--这句是重定义元表的索引Class.__index = Class--构造体,构造体的名字是随便起的,一般都叫名为 new()function Class:new(x,y)--初始化self,如果没有这句,那么类所建立的对象改变,其他对象都会改变local self = {} --将self的元表设定为Classsetmetatable(self, Class) --属性值初始化self.x = xself.y = y--返回自身return selfend--这里定义类的其他方法function Class:Show()print("x = " .. self.x .. "     y = " .. self.y)endfunction Class:plus()self.x = self.x + 10self.y = self.y + 10end-- 类的定义完毕,开始建立对象--[[local a = Class:new(12,21)a:Show()a:plus()a:Show()local b = Class:new(99,99)b:Show()b:plus()b:Show()--]]--[[2,继承 LUA之中没有继承的概念,但是可以模拟,我们建立一个新的类Main,它是Class类的子类,包含其一切方法。--]]--声明了新的属性ZClassTo = {z = 0}--设置类型是Classsetmetatable(ClassTo, Class)--还是和类定义一样,表索引设定为自身ClassTo.__index = ClassTo--这里是构造体,多加上了一个新的参数function ClassTo:new(x,y,z)--初始化对象自身local self = {}--将对象自身设定为父类,这个语句相当于其他语言的superself = Class:new(x,y)--将对象自身元表设定为Main类setmetatable(self, ClassTo)--新的属性初始化,如果没有将会按照声明=0self.z = z--返回自身return selfend--定义一个新的方法function ClassTo:go()self.x = self.x + 100end--重定义父类的方法function ClassTo:Show()print("x = " .. self.x .. "     y = " .. self.y .. "      z = " .. self.z)end-- 然后建立对象--[[local c = ClassTo:new(1,10,100)c:Show()local d = ClassTo:new(100, 10, 1)d:go()d:Show()d:plus()d:Show()c:Show()--]]--[[3,多态LUA作为动态语言,支持多态是基本,但是对象?  马上为您呈现--]]--在Class中新定义的一个函数getNum()function Class:getNum()return 100end--这里会引用getNum()function Class:NumToDoubled()return self:getNum() * 2end--在 ClassTo 中重新定义了getNum()function ClassTo:getNum()return 50end-- 演示多态local a = Class:new(10, 20)print(a:NumToDoubled())local b = ClassTo:new(10, 50, 200)print(b:NumToDoubled())print(a:NumToDoubled())--[[调用LUA类的属性请使用点号,而调用其方法请使用冒号--]]

0 0
原创粉丝点击