`
WinLi
  • 浏览: 48867 次
  • 性别: 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,可以继承,覆盖,sample里面实现了简单的lua类定义,并封装了简单的事件驱动机制

    面向对象lua_oo.lua

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

    Lua 中实现类

    Lua中是没有类的概念的,但是程序猿说要面向对象,所以就有了。

    Lua 单例的实现

    Lua中没有类的概念,但是程序猿说要面向对象,然后就有类。程序猿说要继承 和override,然后就有了继承 和 override 。程序猿说要有单例然后有了单例 这里用 Person 和 Student 来作为例子。有少许解释在代码中。

    Lua中文教程(pdf版)

    27.3 在C函数中保存状态.................207 第28章 User-Defined Types in C........212 28.1 Userdata.................212 28.2 Metatables..............215 28.3 访问面向对象的数据...............217 ...

    Lua面向对象编程之类的简单实现方式

    主要介绍了Lua面向对象编程之类的简单实现方式,本文直接给出一个类的编码实例,并详细讲解了调用方式,需要的朋友可以参考下

    Lua 5.3 参考手册

    同时对面向对象编程、函数式编程和数据驱动式编程也提供了良好的支持。 它作为一个强大、轻量的嵌入式脚本语言,可供任何需要的程序使用。 Lua 由 clean C(标准 C 和 C++ 间共通的子集) 实现成一个库。

    lua参考使用手册

    它同样可以对面向对象语言、函数式程序设计(Functional Programming,如Lisp)以及数据驱动编程(data-driven programming)提供很好的支持。它的目标是被用作一种强大的、轻型的配置语言。Lua目前已经被实现为一个...

    Lua5.0参考手册.doc

    它同样可以对面向对象语言、函数式程序设计(Functional Programming,如Lisp)以及数据驱动编程(data-driven programming)提供很好的支持。它的目标是被用作一种强大的、轻型的配置语言。Lua目前已经被实现为一个...

    Lua 5.3 中文参考手册

    同时对面向对象编程、函数式编程和数据驱动式编程也提供了良好的支持。 它作为一个强大、轻量的嵌入式脚本语言,可供任何需要的程序使用。 Lua 由 clean C(标准 C 和 C++ 间共通的子集) 实现成一个库。

    lua 任意多边形面积计算

    lua学习的一个小应用,通采用面向对象编程的方式实现任意多边形的面积的计算

    LUA5.1 脚本语言 编译执行源码

    8、能方便地利用表和动态元机制实现基于原型(prototype-based)的面向对象模型;9、从5.1版开始提供了完善的模块机制,从而更好地支持开发大型的应用程序; Lua 的语法类似PASCAL和Modula但更加简洁,所有的语法产生...

    一个简单的Lua与C++中间层

    自己实现的一个Lua与C++中间层。支持Ruby风格的面向对象。以及Lua内部和C++内部对象的继承。

    lua-oop-iter:Lua OOP-iter,具有增强迭代器类的面向对象编程的 Lua 实现。 它是 APRIL-ANN 工具包的一部分

    具有增强迭代器类的面向对象编程的 Lua 实现。 它是从提取的。 基本用法 在 Lua 解释器或脚本中,在正确的 Lua 路径目录中安装软件后,您可以执行以下操作: > oopiter = require " oop-iter " > class = oopiter...

    Lua 入门教程

    通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。 Lua 应用场景 游戏开发 独立应用脚本 Web 应用脚本 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench...

    lua客户端网络库,主要供手机游戏客户端使用.rar

    一、前言 Lua 是一种轻量小巧的脚本语言,用标准 C 语言编写并...支持面向对象编程 轻量级 可扩展 函数式编程 自动内存管理 通用类型的表–table,可实现数组,哈希表,集合,对象 支持闭包 支持多线程 支持交互式编程

    LuaQuickStartGuide:Lua快速入门指南的源代码-lua source code

    Lua不是面向对象的,但是,使用表和元表,可以从头开始实现对象系统。 在本章的最后,您将在Lua中实现一个对象系统。 第4章:Lua图书馆 本章将介绍全局表,Lua的一些内置模块以及如何创建自定义模块。 在本章

    Poncho-2.0:在魔兽世界中通过继承实现面向对象框架类的库

    一个在魔兽世界中通过继承实现面向对象框架类的库。 在《魔兽世界》中模拟框架类并不简单:Lua默认不支持类,并且一旦创建框架就无法将其释放。 更进一步,可以将框架分配给xml模板和全局名称,一旦设置就无法更改...

    object-lua:[已弃用] Lua 的面向类的 OOP 模块

    对象Lua Lua 的面向类的 OOP 模块这是一个面向类的 Lua 模块的实现,完全用 Lua 编码。 对象模型允许您覆盖new() (请参阅测试),因此您可以编写按照您想要的方式运行的类。 虽然仍处于设计阶段,但界面已变得相当...

    棋牌的胡牌算法。实现 lua 、c++ 、c# 、golang 、js 、java 、python 版本.zip

    Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势...

Global site tag (gtag.js) - Google Analytics