• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Lua > Lua 极简入门指南(七):面向对象编程

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

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了lua 面向对象,lua如何实现面向对象,lua面向对象编程,lua游戏开发实践指南,lua编程指南等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

类

在很多面向对象的语言中有类(class)的概念,对象是类的实例。Lua 中不存在类的概念。Lua 就像 JavaScript 一样是面向原型的语言(http://en.wikipedia.org/wiki/Prototype-based_programming),这类语言使用一个对象表示一个“类”,其他对象(此类的实例)使用此对象作为原型。我们有两个 table p 和 obj,将 p 设置为 obj 的原型(回顾:http://www.jb51.net/article/56690.htm):

setmetatable(obj, {__index = p})
</div>

obj 中不存在的操作会在 p 中查找。

看一个详细的例子:
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
</div>

在方法定义时使用冒号能够添加一个隐藏的参数 self 给方法,在方法调用时使用冒号能够将调用者作为一个额外的参数传递给此方法,例如:
-- 以下两种写法等价
function Account:deposit(v)
function Account.deposit(self, v)
 
-- 以下两种写法等价
a1:deposit(100)
a1.deposit(a1, 100)
</div>

self 为方法的调用者。

在 Account 这个例子中,一个小优化是,我们没有必要创建一个额外的 metatable,而直接使用 Account 作为 metatable。

继承

我们通过一个例子来解释 Lua 如何实现继承。假定我们需要子类 SpecialAccount 继承于 Account,SpecialAccount 是可以透支的。

首先构造一个子类:
SpecialAccount = Account:new()
</div>
这里 SpecialAccount 拥有了(继承了)Account 的 new 方法。那么我们就可以使用 SpecialAccount 构建对象:
local sa = SpecialAccount:new{limit = 1000}
sa:withdraw(100)
</div>

这里通过 SpecialAccount:new 构造了对象 sa,并且 sa 的 metatable 为 SpecialAccount。执行 sa:withdraw(100),Lua 在 sa 中找不到 withdraw,就会在 SpecialAccount 中找,在 SpecialAccount 中也找不到 withdraw,然后在 Account 中找到 withdraw 并调用它。Account 中的 withdraw 显然不是我们想要的,我们在 SpecialAccount 中重新定义它:
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
</div>

我们再调用 sa:withdraw(100),Lua 先在 SpecialAccount 中找到 withdraw 并调用它。

</div>

您可能想查找下面的文章:

  • 深入解读Lua中迭代器与泛型for的使用
  • Lua中函数与面向对象编程的基础知识整理
  • Lua教程(十三):弱引用table
  • Lua面向对象编程之类的简单实现方式
  • Lua模拟面向对象示例分享
  • Lua中实现面向对象的一种漂亮解决方案
  • Lua中让回调函数支持回调对象方法的解决方法
  • Lua 极简入门指南(七):面向对象编程
  • Lua中的面向对象编程详解

相关文章

  • Lua中获取table长度问题探讨
  • Lua中table库函数方法介绍
  • Lua中关系运算符的使用教程
  • vs2012 error c4996: This function or variable may be unsafe
  • Lua中的for循环和迭代器的秘密探究
  • Lua字符串库中的几个重点函数介绍
  • 浅析C\C++和Lua的通信方式
  • C语言中通过LUA API访问LUA脚本变量的简单例子
  • 使用lua实现php的var_dump()函数功能
  • Lua中的持久化和序列化详解

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Lua中的元表(metatable)、元方法(metamethod)详解
    • Lua中的类编程代码实例
    • Lua编程示例(七):协同程序基础逻辑
    • LUA string库使用小结
    • Lua中的协同程序详解
    • Ruby类实例变量、类实例方法和类变量、类方法的区别
    • 在Mac OS中安装Lua的教程
    • Redis教程(五):Set数据类型
    • Lua中使用模块的一些基础知识
    • Nginx+lua 实现调用.so文件

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有