lua中是通过元表来面向对象的,下面就lua面向对象做一下说明:
local Account = {value = 0}
function Account:new(o) -- 这里是冒号哦
o = o or {} -- 如果用户没有提供table,则创建一个
setmetatable(o, self)
self.__index = self
return o
end
function Account:display()
self.value = self.value + 100
print(self.value)
end
local a = Account:new{} -- 这里使用原型Account创建了一个对象a
a:display() --(1)
a:display() --(2)
在Account表中有一个value字段,默认值为0;当我创建了实例对象a时,并没有提供value字段,在display函数中,由于a中没有value字段,就会查找元表Account,最终得到了Account中value的值,等号右边的self.value的值就来源自Account中的value
继承:
local Person = {name = "zhangsan",age = 18,id = 1101}
function Person:new(o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
function Person:display()
print(self.name)
end
function Person:addAge(v)
self.age = self.age + v
end
学生类
local Student = Person:new() --Student类继承自Person类
function Student:display()
print(self.name,self.id)
end
多重继承:
-- 在多个父类中查找字段k
local function parent(k, pParentList)
for i = 1, #pParentList do
local v = pParentList[i][k]
if v then
return v
end
end
end
function Class(...)
local c = {} -- 新类
local parents = {...}
-- 类在其元表中搜索方法
setmetatable(c, {__index = function (t, k) return parent(k, parents) end}) --多重继承就是可以在多个类中去寻找方法
-- 将c作为其实例的元表
c.__index = c
-- 为这个新类建立一个新的构造函数
function c:new(o)
o = o or {}
setmetatable(o, self)
-- self.__index = self 这里不用设置了,在上面已经设置了c.__index = c
return o
end
-- 返回新的类(原型)
return c
end
-- 一个简单的类CA
local CA = {}
function CA:new(o)
o = o or {}
setmetatable(o, {__index = self})
self.__index = self
return o
end
function CA:setName(strName)
self.name = strName
end
-- 一个简单的类CB
local CB = {}
function CB:new(o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
function CB:getName()
return self.name
end
-- 创建一个c类,它的父类是CA和CB
local c = Class(CA, CB)
-- 使用c类创建一个实例对象
local objectC = c:new{name = "Jelly"}
-- 设置objectC对象一个新的名字
objectC:setName("JellyThink")
local newName = objectC:getName()
print(newName)