lua 是一种脚步语言,语言本身并不具备面向对象的特性。

但是我们依然可以利用语言的特性,模拟出面向对象的特性。

面向对象的特性通常会具备:封装,继承,多态的特性,如何在lua中实现这些特性,最主要的就是利用了lua的table和metatable。

  table是一种强大的关联数组,它可以使用数字和字符串做key,而且可以使用点操作符访问table的元素,因此非常使用用于存储一个对象的属性;

  metatable依然可以认为是一种关联数组,但是元表的作用更加强大,主要是:

    1.定义算术操作符和关系操作符的行为
    2.为 Lua 函数库提供支持
    3.控制对 table 的访问

  利用这个特性,我们可以把某个对象的方法存在元表中,当访问对象的方法时,如果自身不具备这个方法,就会在元方法中去寻找,因此利用元表可以轻松实现继承和多态的特性;

关于lua的具体实现:

-- 检查类名是否合法,要求是字符串
function validateClassName(className)
local _type = type(className); if (_type == "string") then
local _len = string.len(className) if (_len <= ) then
return true
else
print("[error] class name length is greater than 40")
return false
end
else
print("[error] class name of class is not a string")
return false
end
end -- 检查属性表是否合法,属性只允许是基本类型(包括number,boolean,string,table,nil)
function validatePropTabel(propTable)
for _, _v in pairs(propTable) do
local _propType = type(_v); if (_propType == "number" or
_propType == "boolean" or
_propType == "string" or
_propType == "table" or
_propType == "nil") then
return true
else
print("[error] prop of class only support base type(number, boolean, string, table, nil), current type is ".._propType)
return false
end
end
end -- 检查父类是否合法,父类目前只支持table类型
function validateSuperClass(superClass)
local _superType = type(superClass) if (_superType == "table" or
_superType == "nil") then
return true
else
print("[error] super class is not a table")
return false
end
end -- className: 创建新类的类名
-- propTable: 新类的属性
-- superClass: 父类
function class(className, propTable, superClass)
print("------------------------------------------------------")
print("[info] create new class <"..className..">:") -- 验证参数合法性
if (not validateClassName(className) or
not validatePropTabel(propTable) or
not validateSuperClass(superClass)) then
return nil
else
print("[info] arguments validated")
end -- 创建新类
local subClass = {}
-- 设置类名
subClass.__className = className
-- 设置元方法
subClass.__index = subClass
-- 设置属性表
subClass.props = propTable
-- 设置父类
if (superClass) then
setmetatable(subClass, superClass)
subClass.super = superClass print("[info] extended from super class "..superClass.__className)
else
subClass.super = nil print("[info] super class is nil")
end -- 设置默认构造函数
if (not subClass.ctor) then
subClass.ctor = function(...)
print(className.." default construct...")
end print("[info] add default constructor")
end
-- 设置默认的析构函数
if (not subClass.dtor) then
subClass.dtor = function()
print(className.." default destruct...")
end print("[info] add default destructor")
end -- 设置new方法
subClass.new = function(...)
-- 创建一个新的实例
local instance = {} -- 继承父类默认的属性
local _cls = subClass.super
while (_cls) do
if (_cls.props) then
print("------------------------------------------------------")
print("[info] extended prop from super class <".._cls.__className..">:")
for _k, _v in pairs(_cls.props) do
print("[info] ".._cls.__className.." key:"..tostring(_k).." value:"..tostring(_v))
instance[_k] = _v
end
print("------------------------------------------------------")
end
_cls = _cls.super
end
-- 设置本类的属性
if (propTable) then
print("------------------------------------------------------")
print("[info] extended prop from super class <"..className..">:")
for _k, _v in pairs(propTable) do
print("[info] "..className.." key:"..tostring(_k).." value:"..tostring(_v))
instance[_k] = _v
end
print("------------------------------------------------------")
end -- 设置实例的元表为本类
setmetatable(instance, subClass)
-- 调用实例的构造函数
instance:ctor(...) print("[info] create instance of class <"..className..">") return instance
end
-- 设置delete方法
subClass.delete = function(instance)
-- 调用实例的析构函数
instance:dtor() -- 删除实例的数据
print("------------------------------------------------------")
print("[info] delete prop from super class <"..className..">:")
for _k, _v in pairs(instance) do
print("[info] "..className.." key:"..tostring(_k).." value:"..tostring(_v))
instance[_k] = nil
end
print("------------------------------------------------------")
-- 删除实例的元表
setmetatable(instance, nil)
-- 删除实例
instance = nil print("[info] delete instance of class <"..className..">")
end print("------------------------------------------------------") return subClass
end

lua 中的面向对象的更多相关文章

  1. Cocos2d-x 脚本语言Lua中的面向对象

    Cocos2d-x 脚本语言Lua中的面向对象 面向对象不是针对某一门语言,而是一种思想.在面向过程的语言也能够使用面向对象的思想来进行编程. 在Lua中,并没有面向对象的概念存在,没有类的定义和子类 ...

  2. lua中的面向对象编程

    简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 上述代码会输出tb1 ~= tb2.说明两个具有相同值得对象是两个不同的对象,同时在Lua中table是引用类型的 ...

  3. Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 在 ...

  4. 【转载】【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态

    [游戏开发]在Lua中实现面向对象特性——模拟类.继承.多态   阅读目录 一.简介 二.前提知识 三.Lua中实现类.继承.多态 四.总结 回到顶部 一.简介 Lua是一门非常强大.非常灵活的脚本语 ...

  5. Lua中的面向对象编程详解

    简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 复制代码代码如下: local tb1 = {a = 1, b = 2}local tb2 = {a = 1, b ...

  6. 【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态

    一.简介 Lua是一门非常强大.非常灵活的脚本语言,自它从发明以来,无数的游戏使用了Lua作为开发语言.但是作为一款脚本语言,Lua也有着自己的不足,那就是它本身并没有提供面向对象的特性,而游戏开发是 ...

  7. Lua 中使用面向对象(续)

    上一篇文章给了一个面向对象的方案,美中不足的是没有析构函数 Destructor,那么这一次就给它加上. 既然是析构,那么就是在对象被销毁之前做该做的事情,lua 5.1 的 userdata 可以给 ...

  8. Lua中的userdata

    [话从这里说起] 在我发表<Lua中的类型与值>这篇文章时,就有读者给我留言了,说:你应该好好总结一下Lua中的function和userdata类型.现在是时候总结了.对于functio ...

  9. 9----Lua中的面向对象

    什么是面向对象? 使用对象.类.继承.封装.消息等基本概念来进行程序设计 面向对象最重要的两个概念就是:对象和类 对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位 一个对象由一组属性 ...

随机推荐

  1. 【转】jQuery异步上传文件

    用了 jQuery Form插件来解决这个问题:http://malsup.com/jquery/form/#code-samples 有没有不用该插件来实现呢? 解决方法: 可以采用HTML5,用j ...

  2. 详解Android功耗分析工具Power Tutor的使用

    简介: PowerTutor 是由美国密歇根大学在谷歌的指导下开发的.它是用来展示google智能手机中主要组件或应用功耗的一种应用程序.例如,CPU,网络链接,LCD显示屏,GPS等.它允许开发者很 ...

  3. MYSQL数据表操作语句

    1.查看某数据库中的表 SHOW [FULL] TABLES [FROM db_name] [LIKE 'pattern'] SHOW TABLES列举了给定数据库中的非TEMPORARY表.也可以使 ...

  4. HDU 5669 线段树优化建图+分层图最短路

    用线段树维护建图,即把用线段树把每个区间都标号了,Tree1中子节点有到达父节点的单向边,Tree2中父节点有到达子节点的单向边. 每次将源插入Tree1,汇插入Tree2,中间用临时节点相连.那么T ...

  5. 三部曲一(数据结构)-1022-Gold Balanced Lineup

    Gold Balanced Lineup Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Othe ...

  6. [GodLove]Wine93 Tarining Round #1

    比赛链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=44664#overview 题目来源: 2011 Asia Regional ...

  7. 一个共享内存hash

    Background 我们的多进程程序碰到一个需求:做key-value查询,然后拿获取到的value去做一些事情.这些key-value存储在很多词典文件中,数量级>10w,如果每个进程都加载 ...

  8. Java问题总结

    1.如何查看使用java的版本 cmd-->java -version 2.如何下载jdk,sdk Java.JDK(工具包)的安装_百度经验http://jingyan.baidu.com/a ...

  9. php开发工具。。

    看了好多决定用phpstorm. hahaha PHP还是挺好玩的 但是貌似犯蠢一下,MAC自带有php环境: 我还下了一个XAMPP,不过无所谓啦. 都可以用

  10. 关于清除丢失贴图与IES文件

    fn YY_clrmessingmaps = ( YY_messingmap = #() allBitmaps = getClassInstances BitmapTexture -- 所有材质 to ...