一些面向对象的语言中提供了类的概念,作为创建对象的模板。在这些语言里,对象是类的实例。Lua 不存在类的概念,每个对象定义他自己的行为并拥有自己的形状(shape) 。在这些语言中, 对象没有类。 相反, 每个对象都有一个 prototype(原型) ,当调用不属于对象的某些操作时,会最先会到 prototype 中查找这些操作。在这类语言中实现类(class)的机制,我们创建一个对象,作为其它对象的原型即可(原型对象为类,其它对象为类的 instance) 。类与 prototype 的工作机制相同,都是定义了特定对象的行为。
extends.lua
extends.lua
Account = { balance = 0} --初始化对象
function Account:deposit(v) --定义方法
self.balance = self.balance + v
end
function Account:new(o) --原型继承方法
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
function Account:withdraw (v) --定义方法
if v > self.balance then error"insufficient funds" end
self.balance = self.balance - v
end
---继承
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{limit=1000.00}
s:deposit(100.00)
s:withdraw(200.00)
print(s.balance)