在 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实现OOP,可以继承,覆盖,sample里面实现了简单的lua类定义,并封装了简单的事件驱动机制
用lua面向对象编程,如何在lua中写c++中的类
Lua中是没有类的概念的,但是程序猿说要面向对象,所以就有了。
Lua中没有类的概念,但是程序猿说要面向对象,然后就有类。程序猿说要继承 和override,然后就有了继承 和 override 。程序猿说要有单例然后有了单例 这里用 Person 和 Student 来作为例子。有少许解释在代码中。
27.3 在C函数中保存状态.................207 第28章 User-Defined Types in C........212 28.1 Userdata.................212 28.2 Metatables..............215 28.3 访问面向对象的数据...............217 ...
主要介绍了Lua面向对象编程之类的简单实现方式,本文直接给出一个类的编码实例,并详细讲解了调用方式,需要的朋友可以参考下
同时对面向对象编程、函数式编程和数据驱动式编程也提供了良好的支持。 它作为一个强大、轻量的嵌入式脚本语言,可供任何需要的程序使用。 Lua 由 clean C(标准 C 和 C++ 间共通的子集) 实现成一个库。
它同样可以对面向对象语言、函数式程序设计(Functional Programming,如Lisp)以及数据驱动编程(data-driven programming)提供很好的支持。它的目标是被用作一种强大的、轻型的配置语言。Lua目前已经被实现为一个...
它同样可以对面向对象语言、函数式程序设计(Functional Programming,如Lisp)以及数据驱动编程(data-driven programming)提供很好的支持。它的目标是被用作一种强大的、轻型的配置语言。Lua目前已经被实现为一个...
同时对面向对象编程、函数式编程和数据驱动式编程也提供了良好的支持。 它作为一个强大、轻量的嵌入式脚本语言,可供任何需要的程序使用。 Lua 由 clean C(标准 C 和 C++ 间共通的子集) 实现成一个库。
lua学习的一个小应用,通采用面向对象编程的方式实现任意多边形的面积的计算
8、能方便地利用表和动态元机制实现基于原型(prototype-based)的面向对象模型;9、从5.1版开始提供了完善的模块机制,从而更好地支持开发大型的应用程序; Lua 的语法类似PASCAL和Modula但更加简洁,所有的语法产生...
自己实现的一个Lua与C++中间层。支持Ruby风格的面向对象。以及Lua内部和C++内部对象的继承。
具有增强迭代器类的面向对象编程的 Lua 实现。 它是从提取的。 基本用法 在 Lua 解释器或脚本中,在正确的 Lua 路径目录中安装软件后,您可以执行以下操作: > oopiter = require " oop-iter " > class = oopiter...
通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。 Lua 应用场景 游戏开发 独立应用脚本 Web 应用脚本 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench...
一、前言 Lua 是一种轻量小巧的脚本语言,用标准 C 语言编写并...支持面向对象编程 轻量级 可扩展 函数式编程 自动内存管理 通用类型的表–table,可实现数组,哈希表,集合,对象 支持闭包 支持多线程 支持交互式编程
Lua不是面向对象的,但是,使用表和元表,可以从头开始实现对象系统。 在本章的最后,您将在Lua中实现一个对象系统。 第4章:Lua图书馆 本章将介绍全局表,Lua的一些内置模块以及如何创建自定义模块。 在本章
一个在魔兽世界中通过继承实现面向对象框架类的库。 在《魔兽世界》中模拟框架类并不简单:Lua默认不支持类,并且一旦创建框架就无法将其释放。 更进一步,可以将框架分配给xml模板和全局名称,一旦设置就无法更改...
对象Lua Lua 的面向类的 OOP 模块这是一个面向类的 Lua 模块的实现,完全用 Lua 编码。 对象模型允许您覆盖new() (请参阅测试),因此您可以编写按照您想要的方式运行的类。 虽然仍处于设计阶段,但界面已变得相当...
Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势...