源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Lua 极简入门指南(七):面向对象编程

  • 时间:2021-05-28 12:46 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Lua 极简入门指南(七):面向对象编程
[b]类[/b] 在很多面向对象的语言中有类(class)的概念,对象是类的实例。Lua 中不存在类的概念。Lua 就像 JavaScript 一样是面向原型的语言([url=http://en.wikipedia.org/wiki/Prototype-based_programming]http://en.wikipedia.org/wiki/Prototype-based_programming[/url]),这类语言使用一个对象表示一个“类”,其他对象(此类的实例)使用此对象作为原型。我们有两个 table p 和 obj,将 p 设置为 obj 的原型(回顾:[url=http://www.1sucai.cn/article/56690.htm]http://www.1sucai.cn/article/56690.htm[/url]):
[u]复制代码[/u] 代码如下:
setmetatable(obj, {__index = p})
obj 中不存在的操作会在 p 中查找。 看一个详细的例子:
[u]复制代码[/u] 代码如下:
Account = {     -- 默认的 balance 的值     balance = 0 }   function Account:new(o)     o = o or {}     -- 设置原型为 Account     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         print('insufficient funds')         return     end     self.balance = self.balance - v end   -- 构建 Account 对象,初始 balance 为 100 local a1 = Account:new{balance = 100} a1:deposit(100)    --> balance == 200 a1:withdraw(100)   --> balance == 100   -- 构建 Account 对象,使用默认的 balance local a2 = Account:new() a2:deposit(100)    --> balance == 100
在方法定义时使用冒号能够添加一个隐藏的参数 self 给方法,在方法调用时使用冒号能够将调用者作为一个额外的参数传递给此方法,例如:
[u]复制代码[/u] 代码如下:
-- 以下两种写法等价 function Account:deposit(v) function Account.deposit(self, v)   -- 以下两种写法等价 a1:deposit(100) a1.deposit(a1, 100)
self 为方法的调用者。 在 Account 这个例子中,一个小优化是,我们没有必要创建一个额外的 metatable,而直接使用 Account 作为 metatable。 [b]继承[/b] 我们通过一个例子来解释 Lua 如何实现继承。假定我们需要子类 SpecialAccount 继承于 Account,SpecialAccount 是可以透支的。 首先构造一个子类:
[u]复制代码[/u] 代码如下:
SpecialAccount = Account:new()
这里 SpecialAccount 拥有了(继承了)Account 的 new 方法。那么我们就可以使用 SpecialAccount 构建对象:
[u]复制代码[/u] 代码如下:
local sa = SpecialAccount:new{limit = 1000} sa:withdraw(100)
这里通过 SpecialAccount:new 构造了对象 sa,并且 sa 的 metatable 为 SpecialAccount。执行 sa:withdraw(100),Lua 在 sa 中找不到 withdraw,就会在 SpecialAccount 中找,在 SpecialAccount 中也找不到 withdraw,然后在 Account 中找到 withdraw 并调用它。Account 中的 withdraw 显然不是我们想要的,我们在 SpecialAccount 中重新定义它:
[u]复制代码[/u] 代码如下:
function SpecialAccount:withdraw(v)     if v - self.balance >= self:getLimit() then         print('insufficient funds')         return     end     self.balance = self.balance - v end   function SpecialAccount:getLimit()     return self.limit or 0 end
我们再调用 sa:withdraw(100),Lua 先在 SpecialAccount 中找到 withdraw 并调用它。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部