资料摘自<Lua程序设计(第二版)>
类
一个类就是一个创建对象的模具。Lua则没有类的概念,每个对象只能自定义行为和形态(下面所说的类是由table模拟出来的)。
定义一个类示例如下:
Account = {balance = 0}
function Account:new(o) --声明构造函数
o = o or {}
setmetatable(o,self)
self.__index = self
return o
end
function Account:deposit(v)
self.balance = self.balance + v
end
function Account:withdraw(v)
if v>self.balance then error "insufficient funds" end
self.balance = self.balance - v
end
使用:
b = Account:new()
b.deposit(10)
print(b.balance) -->10
继承
若想从这个类派生出一个子类SpecialAccount,可如下示例:
SpecialAccount = Account:new()
此时可以在子类中添加父类没有的方法,字段等
function SpecialAccount:withdraw(v) --重定义基类继承的方法
if v-self.balance>=self::getLimit() then
error"insufficient funds"
end
self.balance = self.balance - v
end
function SpecialAccount:getLimit() --添加新的方法
return self.limit or 0
end
使用:
s=SpecialAccount:new()
s:withdraw(200.00) --此时调用的是SpecialAccount中的withdraw方法
多重继承
多重继承意味着一个类可以具有多个基类。
local function search(k,plist) --在table list中查找k
for i=1,#plist do
local v=plist[i][k] --尝试第i个基类
if v then return v end
end
end
function createClass(...)
local c = {} --新类
local parents={...}
--类在其父类列表中的搜索方法
setmetatable(c,{__index = function(t,k) return search(k,parents) end})
--将c作为其实例元表
c.__index = c
--为这个新类定义一个新的构造函数
function c:new(o)
o = o or {}
setmetatable(o,c)
return o
end
return c --返回新类
end
Named = {}
function Named:getname()
return self.name
end
function Named:setname(n)
self.name = n
end
NamedAccount = createClass(Account,Named) --创建新类同时从Account,Named派生
使用:
account = NamedAccount:new{name="Paul"}
print(account:getname()) -->Paul