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

posted on 2014-07-24 14:00  laihaiteng  阅读(344)  评论(0编辑  收藏  举报

导航