_Account = {} --创建一张借记卡 function _Account:new( tb ) local _Tb = tb or {} _Tb._mBalance = _Tb._mBalance or 0 setmetatable(_Tb, self) self.__index = self return _Tb end --借记卡取款 function _Account:desposit( value ) if value > self._mBalance then print(string.format("取款"..value .. "失败, 剩余存款" .. self._mBalance)) return end self._mBalance = self._mBalance - value print(string.format("取款"..value .. ", 剩余存款" .. self._mBalance)) end --存钱 function _Account:addBalance(val) local num = val or 0 self._mBalance = self._mBalance + num print("存钱"..val) end --[[ 信用卡也具备储蓄卡的存取功能,所以直接继承储蓄卡,复用储蓄卡的存钱功能。 我们在访问一个表不存在的域时,lua解释器会去查找metatable中是否有__index方法(metamethod),如果不存在则返回nil。 _Credit是_Account:new出来的,metatable是_Account,__index也是_Account,所以当_Credit对象访问addBalance的时候, 会到_Account中找。 ]] _Credit = _Account:new({_mLimit = 1000}) --信用卡取款 function _Credit:desposit( value ) if value > self._mBalance + self._mLimit then print(string.format("取款"..value .. "失败, 剩余额度" .. self._mLimit .. ", 剩余存款"..self._mBalance)) return end if self._mBalance >= value then self._mBalance = self._mBalance - value else self._mLimit = self._mLimit - (value - self._mBalance) self._mBalance = 0 end print(string.format("取款"..value .. ", 剩余额度" .. self._mLimit .. ", 剩余存款"..self._mBalance)) end print(" --储蓄卡--") local myAccount_2 = _Account:new() myAccount_2:addBalance(1000) myAccount_2:desposit(200) myAccount_2:desposit(2000) print(" --信用卡--") local cyCredit = _Credit:new() cyCredit:addBalance(600) cyCredit:desposit(500) cyCredit:desposit(500) cyCredit:desposit(1000) --[[结果 --储蓄卡-- 存钱1000 取款200, 剩余存款800 取款2000失败, 剩余存款800 --信用卡-- 存钱600 取款500, 剩余额度1000, 剩余存款100 取款500, 剩余额度600, 剩余存款0 取款1000失败, 剩余额度600, 剩余存款0 ]]