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

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

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

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

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

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

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

关于lua的具体实现:

  1. -- 检查类名是否合法,要求是字符串
  2. function validateClassName(className)
  3. local _type = type(className);
  4.  
  5. if (_type == "string") then
  6. local _len = string.len(className)
  7.  
  8. if (_len <= ) then
  9. return true
  10. else
  11. print("[error] class name length is greater than 40")
  12. return false
  13. end
  14. else
  15. print("[error] class name of class is not a string")
  16. return false
  17. end
  18. end
  19.  
  20. -- 检查属性表是否合法,属性只允许是基本类型(包括numberbooleanstringtablenil
  21. function validatePropTabel(propTable)
  22. for _, _v in pairs(propTable) do
  23. local _propType = type(_v);
  24.  
  25. if (_propType == "number" or
  26. _propType == "boolean" or
  27. _propType == "string" or
  28. _propType == "table" or
  29. _propType == "nil") then
  30. return true
  31. else
  32. print("[error] prop of class only support base type(number, boolean, string, table, nil), current type is ".._propType)
  33. return false
  34. end
  35. end
  36. end
  37.  
  38. -- 检查父类是否合法,父类目前只支持table类型
  39. function validateSuperClass(superClass)
  40. local _superType = type(superClass)
  41.  
  42. if (_superType == "table" or
  43. _superType == "nil") then
  44. return true
  45. else
  46. print("[error] super class is not a table")
  47. return false
  48. end
  49. end
  50.  
  51. -- className: 创建新类的类名
  52. -- propTable: 新类的属性
  53. -- superClass: 父类
  54. function class(className, propTable, superClass)
  55. print("------------------------------------------------------")
  56. print("[info] create new class <"..className..">:")
  57.  
  58. -- 验证参数合法性
  59. if (not validateClassName(className) or
  60. not validatePropTabel(propTable) or
  61. not validateSuperClass(superClass)) then
  62. return nil
  63. else
  64. print("[info] arguments validated")
  65. end
  66.  
  67. -- 创建新类
  68. local subClass = {}
  69. -- 设置类名
  70. subClass.__className = className
  71. -- 设置元方法
  72. subClass.__index = subClass
  73. -- 设置属性表
  74. subClass.props = propTable
  75. -- 设置父类
  76. if (superClass) then
  77. setmetatable(subClass, superClass)
  78. subClass.super = superClass
  79.  
  80. print("[info] extended from super class "..superClass.__className)
  81. else
  82. subClass.super = nil
  83.  
  84. print("[info] super class is nil")
  85. end
  86.  
  87. -- 设置默认构造函数
  88. if (not subClass.ctor) then
  89. subClass.ctor = function(...)
  90. print(className.." default construct...")
  91. end
  92.  
  93. print("[info] add default constructor")
  94. end
  95. -- 设置默认的析构函数
  96. if (not subClass.dtor) then
  97. subClass.dtor = function()
  98. print(className.." default destruct...")
  99. end
  100.  
  101. print("[info] add default destructor")
  102. end
  103.  
  104. -- 设置new方法
  105. subClass.new = function(...)
  106. -- 创建一个新的实例
  107. local instance = {}
  108.  
  109. -- 继承父类默认的属性
  110. local _cls = subClass.super
  111. while (_cls) do
  112. if (_cls.props) then
  113. print("------------------------------------------------------")
  114. print("[info] extended prop from super class <".._cls.__className..">:")
  115. for _k, _v in pairs(_cls.props) do
  116. print("[info] ".._cls.__className.." key:"..tostring(_k).." value:"..tostring(_v))
  117. instance[_k] = _v
  118. end
  119. print("------------------------------------------------------")
  120. end
  121. _cls = _cls.super
  122. end
  123. -- 设置本类的属性
  124. if (propTable) then
  125. print("------------------------------------------------------")
  126. print("[info] extended prop from super class <"..className..">:")
  127. for _k, _v in pairs(propTable) do
  128. print("[info] "..className.." key:"..tostring(_k).." value:"..tostring(_v))
  129. instance[_k] = _v
  130. end
  131. print("------------------------------------------------------")
  132. end
  133.  
  134. -- 设置实例的元表为本类
  135. setmetatable(instance, subClass)
  136. -- 调用实例的构造函数
  137. instance:ctor(...)
  138.  
  139. print("[info] create instance of class <"..className..">")
  140.  
  141. return instance
  142. end
  143. -- 设置delete方法
  144. subClass.delete = function(instance)
  145. -- 调用实例的析构函数
  146. instance:dtor()
  147.  
  148. -- 删除实例的数据
  149. print("------------------------------------------------------")
  150. print("[info] delete prop from super class <"..className..">:")
  151. for _k, _v in pairs(instance) do
  152. print("[info] "..className.." key:"..tostring(_k).." value:"..tostring(_v))
  153. instance[_k] = nil
  154. end
  155. print("------------------------------------------------------")
  156. -- 删除实例的元表
  157. setmetatable(instance, nil)
  158. -- 删除实例
  159. instance = nil
  160.  
  161. print("[info] delete instance of class <"..className..">")
  162. end
  163.  
  164. print("------------------------------------------------------")
  165.  
  166. return subClass
  167. 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. 前后数据交互(ajax) -- 初始化页面表格

    // 初始化员工信息列表 function loadpage ( pageNum ) { var keywords = $("#keywords").val(); $(" ...

  2. Winform基础知识

    1.关于登陆部分 this.DialogResult = DialogResult.OK; this.Close(); FrmLogin login = new FrmLogin(m_CurUser) ...

  3. php大力力 [046节] 兄弟连高洛峰 PHP教程 2015年[最新最新最新最新最新]

    兄弟连高洛峰老师新版PHP视频教程列表[每日更新] http://bbs.lampbrother.net/read-htm-tid-160506.html HTML部分1.[2015]兄弟连高洛峰 H ...

  4. rpm软件包管理

    RPM 有五种基本的操作方式(不包括创建软件包): 安装, 卸载, 升级, 查询,和验证. 下面我们就来逐一的讲解吧. 一. 安装RPM包 RPM 软件包通常具有类似foo-1.0-1.i386.rp ...

  5. mouseover 移入某个元素后停留一段时间再执行函授,我用于解决轮播图下面计数用的元素快速移入后会出BUG的问题。

    var stop; $(this).bind("mouseover",function(){ stop= setTimeout(function(){ },200); }).bin ...

  6. USACO 08-Nov( 最小生成树)

    美国人出题拐弯抹角,倒是挺尊重动物的 10206301 2 52 3 52 4 123 4 172 5 153 5 64 5 12 Hint从牧场4起床, 然后按照 4, 5, 4, 2, 3, 2, ...

  7. fancybox 最基本的使用步骤

    初步使用第一步 :引用js和样式 第二步 :设定要触发显示的元素(a标签,链接href指向div的id)  <div><a href="#adddivtest" ...

  8. 委托Delegate,多播委托和委托链

    定义一个委托 public delegate void CalculateDelegate(int 32 x,int 32 y); 定义一个委托类型的变量 public static Calculat ...

  9. Python培训12期-day2作业-购物车

    #!/usr/bin/env python import sys import os import getpass 商品={ '图书': { "<Puppet实战>": ...

  10. 超级有用的各类web常用手册

    以下是链接地址: 各种web常用手册