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. 说一说vector<bool>

    vector<T>标准库模版类应该是绝大多数c++程序员使用频率比较高的一个类了.不过vector<bool>也许就不那么被程序员所了解.关于vector<bool> ...

  2. 当一个activity中按钮过多时怎么办?

    这几天看极客学院的视频,跟视频中的老师学到的一些小技巧~~ .setOnClickListener(this) 通过重写this(我猜的是重写),下面有onClicked() package exam ...

  3. hdu 2063

    ps:二分匹配法,匈牙利算法.感觉自己只是学了点皮毛...这里贴上大神的微博,深入浅出的讲了匈牙利算法: http://blog.csdn.net/dark_scope/article/details ...

  4. MySQL文件目录格式及存放位置

    了解MYSQL的都知道,在MYSQL中建立任何一张数据表,在其数据目录对应的数据库目录下都有对应表的.frm文件,.frm文件是用来保存每个数据表的元数据(meta)信息,包括表结构的定义等,.frm ...

  5. IIS 7.5 高并发参数配置

    IIS 7.5 高并发参数配置 由于之前使用的是默认配置,服务器最多只能处理5000个同时请求,对于高并发请求,参照文档设置10万并发 1. 调整IIS 7应用程序池队列长度 由原来的默认1000改为 ...

  6. 深入了解Hibernate的缓存使用

    Hibernate缓存 缓存是计算机领域的概念,它介于应用程序和永久性数据存储源(如在硬盘上的文件或者数据库)之间,其作用是降低应用程序 直接读写永久性数据存储源的频率,从而提高应用的运行性能.缓存中 ...

  7. 黑马程序员:Java编程_基础语法

    =========== ASP.Net+Android+IOS开发..Net培训.期待与您交流!=========== 一.数据类型 基本数据类型(简单数据类型.语言所内置的类型) 引用数据类型:(自 ...

  8. Android Listview 性能优化

    首先我一般使用的适配器是BaseAdapter,其中有两个方法最主要,分别是: getCount,getView, 在对Listview 进行优化的时候,首先使用 convertview 和viewH ...

  9. 【转】vc++MCF/C++/C中怎样让应用程序获得或以管理员权限运行 ,ShellExecuteEX编程 --- 获取管理员权限

    ShellExecuteEX编程 --- 获取管理员权限:http://blog.csdn.net/jhui163/article/details/5873027 怎样让你的应用程序获得管理员权限:就 ...

  10. python百分比数比较大小

    python是无法识别百分比的,估计你的百分比是string,所以需要转成int # !/usr/bin/python3.4 # -*- coding: utf-8 -*- # 百分数转为int de ...