[转]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

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

--Lua中的面向对象

--[[

  复制表方式面向对象

  参数为一张表,通过遍历这张表取值,赋给一张空表,最后返回新建的表,来达到克隆表

]]

function clone(tab)

    local ins = {}

    for key, var in pairs(tab) do

        ins[key] = var

    end

    return ins

end

--[[

  复制表

  第一参数是目标表,第二个参数是需要复制的表

  通过遍历tab来取值将它赋值到目标表中

]]

function copy(dist,tab)

    for key, var in pairs(tab) do

        dist[key] = var

    end

end

-- 定义一张空表,相当于一个类

People ={}

--function People.sayHi()

--  print("People say hi")

--end

-- 定义类中的方法sayHi,传入一个self参数

People.sayHi = function (self)

    print("People say hi:"..self.name)

end

-- 定义一个new方法,传进一个name参数,通过克隆People这张表来生成一个对象

-- 相当于类当中的一个构造方法

People.new = function (name)

    local self = clone(People)

    self.name = name

    

    return self

end

--local p = clone(People)

--p.sayHi()

--生成一个新的对象

local p = People.new("ZhangSan")

--p.sayHi(p)

--p:sayHi()

--定义一张空表,也代表一个类

Man = {}

--Man中的构造方法,实现Lua中类的继承

Man.new = function (name)

    local self = People.new(name)

    --附加Man中所有的键值对到People中的实例中去

    copy(self,Man)

    return self

end

Man.sayHello = function ()

    print("Man say hello")

end

--重写父类People中的sayHi方法

Man.sayHi = function (self)

    print("Man sayHi "..self.name)

end

--创建Man的一个实例

local m = Man.new("Lisi")

m:sayHi()

以上代码已经有详细的注释,读者需要仔细阅读这里所给出的例子。

二、使用函数闭包的形式实现面向对象


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

--以函数闭包的形式实现面向对象

--定义一个方法,函数闭包实现一个类的概念

function People(name)

    local self = {}

  --初始化方法,私有的

    local function init()

        self.name = name

    end

  

    self.sayHi = function ()

        print("Hello "..self.name)

    end

  --调用初始化

    init()

    return self

end

--实例化一个对象

local p = People("ZhangSan")

p:sayHi()

--函数闭包的形式实现类继承

function Man(name)

    local self = People(name)

    

--  local function init()

--     

--  end

    self.sayHello = function ()

        print("Hi "..self.name)

    end

    

    return self

end

local m = Man("Lisi")

--m:sayHello()

m:sayHi()

以上两种方式均可实现面向对象,目测第二种方法更为简洁一些,具体使用按照个人的喜好来做。

原文链接:http://cn.cocos2d-x.org/tutorial/show?id=1133

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

时间: 2024-10-27 18:23:30

[转]Lua中的面向对象实现方法的相关文章

[转]Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那这篇博文就是主要讲的如果定义这个指定的函数,这个指定的函数时什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连

[转]Lua语言基础汇总(6)-- 迭代器与泛型for

前言 迭代器就是一种可以遍历一种集合中所有元素的机制,在Lua中,通常将迭代器表示为函数.每调用一次函数,就返回集合中的“下一个”元素.每个迭代器都需要在每次成功调用之后保存一些状态,这样才能知道它所在的位置及如何走到下一个位置,通过之前博文的总结,闭包对于这样的任务提供了极佳的支持.现在我们就用代码来实现一个简单的迭代器. 1 2 3 4 5 6 7 8 9 10 11 12 function values(tb)      local i = 0      return function (

[转]Lua语言基础汇总(2) -- 表达式

算术操作符 Lua支持常规的算术操作符有:”+”(加法),”-”(减法),”*”(乘法),”/”(除法),”^”(指数),”%”(取模),一元的”-”(负号).所有的这些操作符都用于实数.例如:x^0.5将计算x的平方根,x^3将计算x的3次方. 关系操作符 Lua提供的关系操作符有:”<”,”>”,”<=”,”>=”,”==”,”~=”:所有这些操作符的运算结果都是true或false. 操作符==用于相等性测试,操作符~=用于不等性测试.这两个操作符可以应用于任意两个值.如果两

[转]Lua语言基础汇总(4) -- 函数

Lua中的函数和C++中的函数的含义是一致的,Lua中的函数格式如下: 1 2 3 function MyFunc(param)      -- Do something end 在调用函数时,也需要将对应的参数放在一对圆括号中,即使调用函数时没有参数,也必须写出一对空括号.对于这个规则只有一种特殊的例外情况:一个函数若只有一个参数,并且此参数是一个字符串或table构造式,那么圆括号便可以省略掉.看以下代码: 1 2 3 4 5 6 print "Hello World"      

[转]Lua语言基础汇总(3) -- 语句

赋值 赋值的基本含义是修改一个变量或一个table中字段的值,这个和其它语言没有多少区别,但是对于Lua,有一个特性,它允许“多重赋值”,也就是一下子将多个值赋予多个变量,例如以下代码: 1 2 3 local x1, x2 = 2, 4 print(x1)     -->2 print(x2)     -->4 在多重赋值中,Lua先对等号右边的所有元素求值,然后才执行赋值,例如以下用法,可以非常简便的交换两个元素的值: 1 2 3 4 local x1, x2 = 2, 4 x1, x2 

[转]Lua语言基础汇总(7) -- 协同程序

前言 协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西.从概念上讲,线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行.就是说,一个具有多个协同程序的程序在任意时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显式地要求挂起时,它的执行才会暂停. 协同程序基础 Lua将所有关于协同程序的函数放置在一个名为“coroutine”的table中.函数create

[转]Lua语言基础汇总(5) -- 闭包

前言 在很多语言中都有闭包的概念,而在这里,我将主要对Lua语言的闭包概念进行分析与总结.希望对大家学习Lua有帮助. 什么是闭包? 闭包在Lua中是一个非常重要的概念,闭包是由函数和与其相关的引用环境组合而成的实体.我们再来看一段代码: 1 2 3 4 5 6 7 8 9 10 11 function newCounter()      local i = 0      return function () -- 匿名函数           i = i + 1           retur

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 =