Cocos2d-x 脚本语言Lua中的面向对象
面向对象不是针对某一门语言,而是一种思想。在面向过程的语言也能够使用面向对象的思想来进行编程。
在Lua中,并没有面向对象的概念存在,没有类的定义和子类的定义。但相同在Lua中能够利用面向对象的思想来实现面向对象的类继承。
一、复制表的方式面向对象
--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()
以上代码已经有具体的凝视。读者须要细致阅读这里所给出的样例。
二、使用函数闭包的形式实现面向对象
--以函数闭包的形式实现面向对象
--定义一个方法,函数闭包实现一个类的概念
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()
以上两种方式均可实现面向对象。目測另外一种方法更为简洁一些,具体使用依照个人的喜好来做。