`
WinLi
  • 浏览: 50886 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在 Lua 中实现面向对象

阅读更多

在 pil 中,lua 的作者推荐了一种方案来实现 OO,比较简洁,但是我依然觉得有些繁琐。

这里给出一种更漂亮一点的解决方案:为了贴代码和修改方便,我把它贴在了 wiki 上。

Lua 中实现面向对象

在这个方案中,只定义了一个函数 class(super) ,用这个函数,我们就可以方便的在 lua 中定义类:
base_type=class() -- 定义一个基类 base_type

function base_type:ctor(x) -- 定义 base_type 的构造函数
  print("base_type ctor")
  self.x=x
end

function base_type:print_x() -- 定义一个成员函数 base_type:print_x
  print(self.x)
end

function base_type:hello() -- 定义另一个成员函数 base_type:hello
  print("hello base_type")
end

以上是基本的 class 定义的语法,完全兼容 lua 的编程习惯。我增加了一个叫做 ctor 的词,作为构造函数的名字。

下面看看怎样继承: test=class(basetype) -- 定义一个类 test 继承于 basetype
function test:ctor() -- 定义 test 的构造函数
  print("test ctor")
end

function test:hello() -- 重载 base_type:hello 为 test:hello
  print("hello test")
end

现在可以试一下了:
a=test.new(1) -- 输出两行,base_type ctor 和 test ctor 。这个对象被正确的构造了。
a:print_x() -- 输出 1 ,这个是基类 base_type 中的成员函数。
a:hello() -- 输出 hello test ,这个函数被重载了。

其实,实现多重继承也并不复杂,这里就不再展开了。更有意义的扩展可能是增加一个 dtor :)

ps. 这里用了点小技巧,将 self 绑定到 closure 上,所以并不使用 a:hello 而是直接用 a.hello 调用成员函数。这个技巧并不非常有用,从效率角度上说,还是不用为好。

分享到:
评论

相关推荐

    lua面向对象实现

    在Lua中实现面向对象编程(OOP)虽然不像其他静态类型语言那样直接,但通过元表和元方法的概念,同样可以构建出具有类和对象的结构。 面向对象编程的基本概念包括类、对象、继承、封装和多态。在Lua中,这些概念的...

    Lua面向对象封装

    在本文中,我们将深入探讨“Lua面向对象封装”这一主题,结合给定的文件名“CC_Object.lua”和“Luatest1.lua”,推测这是关于在Lua中实现面向对象编程(OOP)的示例代码。 首先,让我们理解Lua中的面向对象编程。...

    Lua面向对象.zip

    这个"Lua面向对象.zip"文件包含了关于如何在Lua中实现面向对象编程的代码实例,可以帮助我们深入理解这一概念。 1. **元表和元方法** Lua中的对象通常由表(table)表示,而表的元表(metatable)则是实现OOP的...

    lua面向对象编程类库笔记

    在Lua中实现面向对象编程(OOP)不是原生支持的特性,但可以通过库来实现。在这个主题中,我们将关注两个重要的类库:middleclass和stateful。 首先,我们来看`middleclass`库,它是Lua中最常用的一个面向对象实现...

    Lua 面向对象_luabook_

    在 Lua 中实现面向对象编程(Object-Oriented Programming,简称 OOP)虽然不如某些其他语言那样直接,但仍然提供了强大的机制来支持这一概念。在 "Lua 面向对象" 的文档中,我们将深入探讨 Lua 如何通过元表和原型...

    Lua进阶教程(三)面向对象编程.pdf

    Lua 虽然不是专门设计用于 OOP 的语言,但其灵活的语法和强大的元表功能使得在 Lua 中实现面向对象编程成为可能。 #### OOP 的核心概念 **类(Class)**:类是一个创建对象的可扩展模板,定义了一组属性(成员变量)...

    Lua面向对象封装好的基类Class

    总的来说,"Lua面向对象封装好的基类Class"为Lua开发者提供了一个方便的工具,使他们能够在不支持原生面向对象语法的环境中实现面向对象编程,从而更好地组织代码和设计复杂系统。通过理解和利用这类基类,开发者...

    luaclass简单例子

    总的来说,"luaclass简单例子"涵盖了如何在Lua中实现面向对象编程的基本思路,包括类的模拟、对象的创建和方法的定义。通过`classheader.lua`、`Team.lua`和`TeamMgr.lua`这三份文件,我们可以看到一个从基础类模板...

    Lua支持面向对象代码

    在Lua中,面向对象编程主要通过元表(metatable)和伪构造器(__index和__newindex)来实现。元表是Lua中一个特殊的数据结构,它可以关联到任何表(即对象)上,控制该表的行为。当访问表中不存在的字段时,会触发元...

    Lua类工具包《BjaClassTool》,完全模拟,公有私有属性/静态,继承,运算符重载等等!

    通过阅读和学习这两个文件,你可以更好地理解如何在Lua中实现面向对象编程,以及如何利用`BjaClassTool`来构建复杂的类结构。 总的来说,`BjaClassTool`是一个强大的工具,它通过模仿面向对象编程的关键概念,如类...

    Lua 中实现类

    在Lua编程语言中,虽然原生不支持传统的类(class)和...通过这些技巧,我们可以在Lua中灵活地实现面向对象编程,尽管它不是原生支持的。这种灵活性也使得Lua成为游戏开发和其他需要轻量级脚本语言的场景中的首选工具。

    Programming In Lua 中文版PDF高清

    - **简述**:探讨了如何在Lua中实现面向对象编程,包括类和对象的概念。 - **知识点**: - 类的定义和实例化。 - 继承和多态性的实现。 - 面向对象设计模式的应用。 **第17章 Weak表** - **简述**:讲解了弱表...

    LUA 面向对象设计

    在LUA语言中,面向对象编程(Object-Oriented Programming, OOP)是一种重要的编程范式,它允许开发者组织代码并创建可复用的代码结构。与传统的面向过程编程不同,OOP通过对象的概念来管理数据和行为。尽管LUA不像...

    30log:用于Lua中面向对象的30行库

    【描述】中的信息进一步确认了这个库专注于在Lua中实现面向对象的概念,使得开发者能够以更加结构化的方式编写代码,提升代码的可读性和可维护性。30log通过提供类、对象以及继承等概念,让开发者能够在Lua中享受到...

    面向对象lua_oo.lua

    用lua面向对象编程,如何在lua中写c++中的类

    8-lua基础篇-面向对象编程

    面向对象编程(Object Oriented Programming,OOP)是软件开发中的一种重要编程范式,它...在 Lua 的面向对象编程中,利用表和 `self` 关键字,开发者可以实现类似其他支持 OOP 语言的功能,尽管它没有内置的类结构。

    RandomLuaStuff-源码.rar

    分析源码,我们可以学习如何在Lua中实现面向对象的设计模式。 通过深入研究“RandomLuaStuff”的源码,开发者不仅可以提升对Lua语言的理解,还能获取实际项目中的实践经验,这对于任何希望在Lua领域深化技能的人来...

    Lua中文教程&中文手册

    2. **表与面向对象编程**:Lua中的表不仅是动态数组,还能实现关联数组,支持元表和元方法,是实现面向对象编程的关键。 3. **函数与模块**:Lua中的函数是第一类公民,可以作为参数传递,也可以作为返回值。同时,...

    Lua中文教程 PDF

    元表是Lua中实现面向对象编程的关键,它允许我们为任何类型定义自定义的行为。元方法是通过元表调用的方法,例如,当尝试对表格执行算术操作时,会触发相应的元方法。 8. **垃圾回收** Lua采用引用计数加可达性...

    Lua程序设计,2~4版本pdf电子书,C的Lua语言原滋原味

    第四版进一步强化了这些特性,使得在Lua中进行面向对象编程变得更加自然。 第三部分:Lua的模块化与库 Lua的标准库提供了许多实用功能,例如字符串处理、数学运算、文件操作等。从第二版开始,Lua引入了require函数...

Global site tag (gtag.js) - Google Analytics