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. warning C4305: “=”: 从“int”到“unsigned char”截断解决方法[zz]

    在控制台程序中定义: float x; x=22.333; 编译会出现 warning C4305: “初始化”: 从“double”到“float”截断 系统默认此浮点数是22.333是double ...

  2. Jquery EasyUI DataGrid .net实例

    前台界面:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  3. 【RobotFramework自动化测试】RFS常用脚本

    读取后台数据文件:Import Variables | ${CURDIR}/\ABC.py 定位页面:Wait Until Keyword Succeeds | 5s | 500ms | select ...

  4. 加入Tomcat插件到ECLIPSE中的方法

    1.下载Tomcat插件com.sysdeo.eclipse.tomcat_3.3.1.jar 下载路径http://www.eclipsetotale.com/ 2.安装插件 把下载的插件放到E:\ ...

  5. 不能将 Null 值赋给类型为 (不可为 null 的值类型)的成员。解决方法

    一般代码没有错,是对应的数据库里有的字段是NULL,不是主键,主键肯定不会是NULL的.是其他字段. 把这些列的NULL赋值.

  6. substring,substr,和slice的区别详解。

    1.Substring(x,y) : 输出一个字符串,当其中只有一个参数时,会输出从x开始到结尾的String. 举例: var str="hello";        conso ...

  7. Android 学习第7课,java android project 项目文档结构

    src: 主要存放java源文件 gen:用于存放由开发工具自动生成的内容 R.java(很重要),用于登记各种资源的ID,编译器在你放入资源于自动生成的,程序员不需要自己去修改,是不能自己修改的 往 ...

  8. Python开发库

    在我多年的 Python 编程经历以及在 Github 上的探索漫游过程中,我发掘到一些很不错的 Python 开发包,这些包大大简化了开发过程,而本文就是为了向大家推荐这些开发包. 请注意我特别排除 ...

  9. Svn服务器的安装和配置

    1.安装svn服务器端软件 从镜像服务器或者YUM源下载安装SVN服务器软件:yum install subversion mkdir /usr/local/svn     //创建SVN安装目录 c ...

  10. Android studio 常用插件

    常用插件 GsonFormat 该插件的功能是根据JSON数据生成相应的实体类,插件装好后按Alt+S快捷键呼不出GsonFormat的界面,如果你也遇到类似的问题,就去改一下快捷键吧!我将快捷键改成 ...