lua 中的面向对象
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 中的面向对象的更多相关文章
- Cocos2d-x 脚本语言Lua中的面向对象
Cocos2d-x 脚本语言Lua中的面向对象 面向对象不是针对某一门语言,而是一种思想.在面向过程的语言也能够使用面向对象的思想来进行编程. 在Lua中,并没有面向对象的概念存在,没有类的定义和子类 ...
- lua中的面向对象编程
简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 上述代码会输出tb1 ~= tb2.说明两个具有相同值得对象是两个不同的对象,同时在Lua中table是引用类型的 ...
- Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3 参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 在 ...
- 【转载】【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态
[游戏开发]在Lua中实现面向对象特性——模拟类.继承.多态 阅读目录 一.简介 二.前提知识 三.Lua中实现类.继承.多态 四.总结 回到顶部 一.简介 Lua是一门非常强大.非常灵活的脚本语 ...
- Lua中的面向对象编程详解
简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 复制代码代码如下: local tb1 = {a = 1, b = 2}local tb2 = {a = 1, b ...
- 【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态
一.简介 Lua是一门非常强大.非常灵活的脚本语言,自它从发明以来,无数的游戏使用了Lua作为开发语言.但是作为一款脚本语言,Lua也有着自己的不足,那就是它本身并没有提供面向对象的特性,而游戏开发是 ...
- Lua 中使用面向对象(续)
上一篇文章给了一个面向对象的方案,美中不足的是没有析构函数 Destructor,那么这一次就给它加上. 既然是析构,那么就是在对象被销毁之前做该做的事情,lua 5.1 的 userdata 可以给 ...
- Lua中的userdata
[话从这里说起] 在我发表<Lua中的类型与值>这篇文章时,就有读者给我留言了,说:你应该好好总结一下Lua中的function和userdata类型.现在是时候总结了.对于functio ...
- 9----Lua中的面向对象
什么是面向对象? 使用对象.类.继承.封装.消息等基本概念来进行程序设计 面向对象最重要的两个概念就是:对象和类 对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位 一个对象由一组属性 ...
随机推荐
- 原生javascript加载运行
原生javascript加载运行 (function(){ //TODO sometings }()); 在要运行相应代码的位置加入script标签,创建函数并自执行; 关于window.onload ...
- JMeter学习(十)内存溢出解决方法
使用jmeter进行压力测试时遇到一段时间后报内存溢出outfmenmory错误,导致jmeter卡死了,先尝试在jmeter.bat中增加了JVM_ARGS="-Xmx2048m -Xms ...
- watir学习系列--Watir API介绍
文本框: <INPUT id="email" name="_fmu.u._0.e" value="" /> ...
- Python培训12期-day2作业-购物车
#!/usr/bin/env python import sys import os import getpass 商品={ '图书': { "<Puppet实战>": ...
- Python 基礎 - 字符編碼
Python 解釋器在加載 .py 文件中的代碼時,會對內容進行編碼 (默認 ascill) ASCII (American Standard Code for Information Interch ...
- 使用 IMQ+HTB+iptable 统一流量控制心得
IMQ 是中介队列设备的简称,是一个虚拟的网卡设备,与物理网卡不同的是,通过它可以进行全局的流量整形,不需要一个网卡一个网卡地限速.这对有多个ISP接入的情况特别方便.配合 Iptables,可以非常 ...
- Java-->Tomcat(免费的Java Web服务器)
--> 要在浏览器访问一个Java Web项目,首先需要将这个项目放到服务器中. --> Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器. --> ...
- Spark 个人实战系列(2)--Spark 服务脚本分析
前言: spark最近非常的火热, 本文不讲spark原理, 而是研究spark集群搭建和服务的脚本是如何编写的, 管中窥豹, 希望从运行脚本的角度去理解spark集群. 研究的spark为1.0.1 ...
- Node.js高级编程读书笔记 - 3 网络编程
Outline 3.4 构建TCP服务器 3.5 构建HTTP服务器 3.6 构建TCP客户端 3.7 创建HTTP请求 3.8 使用UDP 3.9 用TLS/SSL保证服务器的安全性 3.10 用H ...
- LA 3027 合作网络 并查集
题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...