首页 > 代码库 > Chapter 16_2 继承
Chapter 16_2 继承
类也是对象,所有它们也可以从其他类获得方法。这就是“继承”,可以在Lua中表示:
Account = { balance = 0}function Account:new(o) o = o or {} setmetatable(o , self) self.__index = self return oendfunction Account:deposit(v) self.balance = self.balance + vendfunction Account:withdraw( v) if v> self.balance then error "infufficient funds" end self.balance = self.balance - vend
如果想从这个类中派生一个子类,以使客户能够透支。则先需要创建一个空的类,从基类继承所有的操作:
SpecialAccount = Account:new()
SpecialAccount就是一个Account的实例。如下所示:
s = SpecialAccount:new(limit = 1000.00)
SpecialAccount从Account继承了new方法。它的self参数表示为SpecialAccount。当执行:
s:deposit(100.00)
Lua在s中不能找到deposit字段,就会查找SpecialAccount,如果还找不到,就查找Account。最终会在那里找到deposit的原始实现。
SpecialAccount之所以特别,是因为可以重定义那些从基类继承的方法。编写一个方法的新实现只需:
function SpecialAccount:withdraw(v) if v - self.balance >= self:getLimit() then error "insufficient funds" end self.balance = self.balance - vendfunction SpecialAccount:getLimit() return self.limit or 0end
现在,当调用s:withdraw(200.00)时,Lua就不会在Account中找了,因为它有了。由于s.limit为1000.00,程序会执行取款,并使s变成一个负的余额。
Lua中的对象有一个特殊现象,就是无须为指定一种新行为而创建一个新类。如果只有一个对象需要某种特殊的行为,那么可以直接在该对象中实现这个行为。
例如账户s表示一个特殊客户,这个客户的透支额度是其余额的10%,那么可以只修改这个对象:
function s:getLimit() return self.balance * 0.10end
调用s:withdraw(200.00)还是会执行SpecialAccount的withdraw。但withdraw调用的self:getLimit则是上面的这个定义。
以上内容来自:《Lua程序设计第二版》和《Programming in Lua third edition 》
Chapter 16_2 继承
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。