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

Lua 中实现面向对象实例

阅读更多

这里提供 Lua 中实现 OO 的一种方案:

 

local _class={}
 
function class(super)
	local class_type={}
	class_type.ctor=false
	class_type.super=super
	class_type.new=function(...) 
			local obj={}
			do
				local create
				create = function(c,...)
					if c.super then
						create(c.super,...)
					end
					if c.ctor then
						c.ctor(obj,...)
					end
				end
 
				create(class_type,...)
			end
			setmetatable(obj,{ __index=_class[class_type] })
			return obj
		end
	local vtbl={}
	_class[class_type]=vtbl
 
	setmetatable(class_type,{__newindex=
		function(t,k,v)
			vtbl[k]=v
		end
	})
 
	if super then
		setmetatable(vtbl,{__index=
			function(t,k)
				local ret=_class[super][k]
				vtbl[k]=ret
				return ret
			end
		})
	end
 
	return class_type
end

 

 

现在,我们来看看怎么使用:

 

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(base_type)	-- 定义一个类 test 继承于 base_type
 
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 ,这个函数被重载了。 
 

 

 

 

分享到:
评论

相关推荐

    Lua面向对象.zip

    Lua面向对象代码实例,绝对完整可用,有问题可留言,欢迎下载!O(∩_∩)O哈哈!!!~~~~~~~

    X-rapido#lua-guide#Lua面向对象编程1

    1、创建一个简单的类 2、创建一个对象 3、访问属性 4、访问成员函数 5、完整实例

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

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

    Lua中的类编程代码实例

    主要介绍了Lua中的类编程代码实例,本文直接用代码讲解类的创建、类的实例化、类的方法调用、类的继承、类的多重继承等面向对象编程方法,需要的朋友可以参考下

    Lua编程示例(二):面向对象、metatable对表进行扩展

    主要介绍了Lua编程示例(二):面向对象、metatable对表进行扩展,本文直接给出实例代码,需要的朋友可以参考下

    tolua ++ 使用例子

    tolua++是一种第三方的软件包,可以为Lua提供面向对象的特性,这样我们就可以使用Lua来编写使用C++语言库的脚本文件. tolua使用例子.

    Lua table类型学习笔记

    主要介绍了Lua table类型学习笔记,本文讲解了table的基础知识和table库函数的使用以及面向对象编程实例,需要的朋友可以参考下

    MOOSE:面向任务对象的脚本环境(MOOSE),用于DCS World中的lua任务脚本设计

    MOOSE的目标是允许任务设计人员使用任务编排对象来增强其脚本编写,这些对象可以从框架中定义的类实例化。 这将允许编写嵌入了最少代码的任务脚本。 当然,框架的丰富程度将决定misson场景的丰富程度。 MOOSE是一种...

    frostmoon:用Löve编写的跨平台应用程序库

    介绍FrostMoon是用Lua编写的面向对象的GUI库,可在iOS,OS X,Linux和Windows 10上运行。FrostMoon的存在是为了更轻松,更快地创建跨平台应用程序,同时最大程度地减少了平台特定的代码。 FrostMoon允许对象中的合成...

    XLua_2018最新版

    * [04_LuaObjectOrented](Assets/XLua/Examples/04_LuaObjectOrented/): 展示lua面向对象和C#的配合。 * [05_NoGc](Assets/XLua/Examples/05_NoGc/): 展示怎么去避免值类型的GC。 * [06_Coroutine](Assets/XLua/...

    Associative-Memory-Machines:虚拟机

    除非没有Meta-Cell,否则,如果它真的存在,就永远无法实例化到系统中,因为它必须递归实现,并且编译器会在Universe结束时崩溃并崩溃,从而尝试重新开始。 元单元是否存在? 可能吗? 你甚至可以说这样的话,而...

    30logclasscommons:用于 30log 和 Class-commons 之间兼容性的插件

    30logclasscommons 该存储库提供了一个插件,用于实现面向对象库和之间的兼容性。 ##下载通过 Git: git clone git://github.com/Yonaba/30logclasscommons用法将文件和复制到您的项目文件夹中。 强烈建议将它们...

    jstar:一种轻量级的可嵌入脚本语言

    完全面向对象的。 从数字到类实例的每个实体都是J *中的对象 模块化。 完善的模块系统使您可以轻松地将代码拆分到多个文件中 容易扩展。 通过使用API​​创建可从J *调用的C函数或导入作为动态库提供的,可以轻松地...

    像计算机科学家一样思考Python(第2版).pdf

    书中还探讨了如何处理文件和数据库,如何理解对象、方法和面向对象编程,如何使用调试技巧来修正语法错误、运行时错误和语义错误。每一章都配有术语表和练习题,方便读者巩固所学的知识和技巧。此外,每一章都抽出...

Global site tag (gtag.js) - Google Analytics