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

什么是面向对象?

使用对象、类、继承、封装、消息等基本概念来进行程序设计

面向对象最重要的两个概念就是:对象和类

对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位

一个对象由一组属性和对这组属性进行操作的一组函数组成

类是具有相同属性和函数的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和函数两个部分

但需注意的是,Lua中并没有提供类的定义能力,但可以把table类型变量当成对象来使用

Lua中的对象

在Lua中 我们将table类型变量当初对象,对象具有数据和操作

  1. student= {
  2. name,
  3. age
  4. }
  5. function student:tostring() -- 冒号表示将本身带入进去作为对象,用self代表自身,类似于java中的this
  6. print("name:".. self.name .. " age:" .. self.age)
  7. end
  8. function student:setName(name)
  9. self.name=name
  10. end
  11. function student:setAge(age)
  12. self.age=age
  13. end
  14. local stu=student
  15. stu:setAge(18) -- 冒号表示将本身带入进去作为对象,用self代表自身,类似于java中的this
  16. stu:setName("JONY")
  17. stu:tostring()
  18. –输出结果如下
  19. name:JONY age:18

类的实现

类是对象的模板,一个类能产生多个对象。

实现类的思想是将Student作为原模版,通过Student来创建其它的对象,那么我们就可以把Student当作类了

创建的对象遇到一个未知的操作时,就会在Student原型中去查找,这也符合了类的继承原则

  1. local student= {
  2.     name,
  3.     age,
  4. }
  5. function student:tostring()
  6.     print("name:".. self.name .. " age:" .. self.age)
  7. end
  8. function student:setName(name)
  9. self.name=name
  10. end
  11. function student:setAge(age)
  12. self.age=age
  13. end
  14. function student:creat(o) --o是table类型的参数
  15. o=o or {} --如果o为nil则创建一个空的table
  16.     setmetatable(o,self) --元表,即把self设置为 o的元表,每一个table都可以添加元表,元表可以改变相应的table的行为
  17. self.__index=self --首先在当前对象中查找操作,如果当前对象中没有,就会到原型student(元表)中查找操作
  18.     return o
  19. end
  20. --[[
  21. local stu=student:creat() --通过student原型(类)创建stu对象
  22. stu:setAge(18)
  23. stu:setName("JONY")
  24. stu:tostring()
  25. student:tostring() --原型并没有被复制,运行报错,说明stu是一个子对象
  26. --得到的结果是:
  27. --name:JONY age:18
  28. --]]
  29. --[[
  30. local stu=student --只是简单的将student指向stu
  31. stu:setAge(18)
  32. stu:setName("JONY")
  33. stu:tostring()
  34. student:tostring() --也能得到结果,说明对原型进行了操作并没有类的实现
  35. --得到的结果是:
  36. --name:JONY age:18
  37. --name:JONY age:18
  38. --]]
时间: 2024-10-25 03:48:23

9----Lua中的面向对象的相关文章

lua中的面向对象编程

简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 上述代码会输出tb1 ~= tb2.说明两个具有相同值得对象是两个不同的对象,同时在Lua中table是引用类型的.我在<Lua中的模块与包>中也总结了,我们是基于table来实现的模块,在table中可以定义函数,也就是说,每个table对象都可以拥有其自己的操作.看一段代码: 上面的代码创建了一个新函数,并将该函数存入Account对象的withDraw字段中,然后我们就可以调用该函数了.不过,在函数中使

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

Cocos2d-x 脚本语言Lua中的面向对象 面向对象不是针对某一门语言,而是一种思想.在面向过程的语言也能够使用面向对象的思想来进行编程. 在Lua中,并没有面向对象的概念存在,没有类的定义和子类的定义.但相同在Lua中能够利用面向对象的思想来实现面向对象的类继承. 一.复制表的方式面向对象 --Lua中的面向对象 --[[ 复制表方式面向对象 參数为一张表.通过遍历这张表取值,赋给一张空表,最后返回新建的表.来达到克隆表 ]] function clone(tab) local ins =

Lua语言基础汇总(12)-- Lua中的面向对象编程

简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 1 2 3 4 5 6 7 8 9 10 11 12 local tb1 = {a = 1, b = 2} local tb2 = {a = 1, b = 2} local tb3 = tb1   if tb1 == tb2 then      print("tb1 == tb2") else      print("tb1 ~= tb2") end   tb3.a = 3 pri

[转]Lua中的面向对象实现方法

面向对象不是针对某一门语言,而是一种思想,在面向过程的语言也可以使用面向对象的思想来进行编程.在Lua中,并没有面向对象的概念存在,没有类的定义和子类的定义,但同样在Lua中可以利用面向对象的思想来实现面向对象的类继承. 一.复制表的方式面向对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

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

一.简介 Lua是一门非常强大.非常灵活的脚本语言,自它从发明以来,无数的游戏使用了Lua作为开发语言.但是作为一款脚本语言,Lua也有着自己的不足,那就是它本身并没有提供面向对象的特性,而游戏开发是一项庞大复杂的工程,如果没有面向对象功能势必会为开发带来一定的不便.不过幸好Lua中有table这样强大的数据结构,利用它再结合元表(metatable),我们便可以很方便地在Lua中模拟出类.继承和多态等面向对象编程具有的特性. 二.前提知识 按照惯例,我们还是先来熟悉一下必要的前提知识,以便方便

Lua 中使用面向对象(续)

上一篇文章给了一个面向对象的方案,美中不足的是没有析构函数 Destructor,那么这一次就给它加上. 既然是析构,那么就是在对象被销毁之前做该做的事情,lua 5.1 的 userdata 可以给其 metatable 增加一个 __gc 域,指定一个函数,将会在被回收时调用,这个 __gc 只能用于 userdata,普遍的 table 不支持:到了 lua 5.2 以后,官方支持了给予普通 table 的 metatable 增加 __gc 域,可以在回收前被回调:具体细节可以参考对应版

Lua中的userdata

[话从这里说起] 在我发表<Lua中的类型与值>这篇文章时,就有读者给我留言了,说:你应该好好总结一下Lua中的function和userdata类型.现在是时候总结了.对于function,我在<Lua中的函数>这篇文章中进行了总结,而这篇文章将会对Lua中的userdata进行仔细的总结.对于文章,大家如果有任何疑议,都可以在文章的下方给我留言,也可以关注我的新浪微博与我互动.学习,就要分享,我期待你的加入. [userdata是啥?] userdata是啥?简单直译就是用户数

Lua中面向对象编程的理解

模块 模块是一个独立的空间,一个独立的环境,访问模块成员需要先require,并使用"模块名.成员名称"的格式访问.注意:模块是一个table. 类 在lua中所有对象都是一个table,类也是一个table,但类应该是一个只读的table,类的定义是通过创建一个模块实现的. lua代码: module("Student",package.seeall) function study(self) end 在调用module方法时添加package.seeall参数的

在lua中创建字段安全的对象

lua萌新,刚刚学习和使用不到一个月.有不对的地方,还望各路大神不吝赐教. lua中可以用table来模拟对象,但table是可以任意增加键值的.在对象模拟中,暂且也叫它为字段(field)吧.如果在面向对象中,你定义了一个对象,可以在对象以外的地方随意改动这个对象的字段,访问不存在的字段,你想象一下这有多恐怖?比如你定义了一个Vector3{float x = 0; float y = 0; float z = 0;}  我在外面某处加一个float t = 1; 当你在创建并引用这对象的时候

Lua程序转载 - 面向对象的实现探讨

> 转载出处:http://blog.csdn.net/xenyinzen/article/details/3536708 元表概念     Lua中,面向对向是用元表这种机制来实现的.首先,一般来说,一个表和它的元表是不同的个体(不属于同一个表),在创建新的table时,不会自动创建元表.但是,任何表都可以有元表(这种能力是存在的). e.g.t = {}print(getmetatable(t))   --> nilt1 = {}setmetatable(t, t1)assert(getm