<Lua程序设计(第二版)>书摘-10

本文介绍了在Lua中如何通过table模拟类和继承机制。首先展示了如何定义一个基本的类Account,包括构造函数和deposit、withdraw方法。接着说明了如何从Account派生出SpecialAccount,并添加新方法和重定义继承方法。最后,文章提到了多重继承的概念,并提供了一个createClass函数来实现多重继承的功能,创建了NamedAccount类,该类同时继承自Account和Named。
摘要由CSDN通过智能技术生成

资料摘自<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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值