LUA类
类一般都有类名,属性声明,构造体,方法,属性。下面用LUA实现类的模拟,类的模拟有很多种,但是都必须用到__index
下面看看代码吧
--声明了类名还有属性,并且给出了属性的初始值。
Class = {x = 0, y = 0}
--这句是重定义元表的索引
Class.__index = Class
--构造体,构造体的名字是随便起的,一般都叫名为 new()
function Class:new(x,y)
--初始化self,如果没有这句,那么类所建立的对象改变,其他对象都会改变
local self = {}
--将self的元表设定为Class
setmetatable(self, Class)
--属性值初始化
self.x = x
self.y = y
--返回自身
return self
end
--这里定义类的其他方法
function Class:Show()
print("x = " .. self.x .. " y = " .. self.y)
end
function Class:plus()
self.x = self.x + 10
self.y = self.y + 10
end
-- 类的定义完毕,开始建立对象
--[[
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类的子类,
包含其一切方法。
--]]
--声明了新的属性Z
ClassTo = {z = 0}
--设置类型是Class
setmetatable(ClassTo, Class)
--还是和类定义一样,表索引设定为自身
ClassTo.__index = ClassTo
--这里是构造体,多加上了一个新的参数
function ClassTo:new(x,y,z)
--初始化对象自身
local self = {}
--将对象自身设定为父类,这个语句相当于其他语言的super
self = Class:new(x,y)
--将对象自身元表设定为Main类
setmetatable(self, ClassTo)
--新的属性初始化,如果没有将会按照声明=0
self.z = z
--返回自身
return self
end
--定义一个新的方法
function ClassTo:go()
self.x = self.x + 100
end
--重定义父类的方法
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 100
end
--这里会引用getNum()
function Class:NumToDoubled()
return self:getNum() * 2
end
--在 ClassTo 中重新定义了getNum()
function ClassTo:getNum()
return 50
end
-- 演示多态
local a = Class:new(10, 20)
print(a:NumToDoubled())
local b = ClassTo:new(10, 50, 200)
print(b:NumToDoubled())
print(a:NumToDoubled())
--[[
调用LUA类的属性请使用点号,而调用其方法请使用冒号
--]]