关于面向对象,Lua语言本身并没有提供面向对象编程的接口
而如果是进行2D游戏的开发,在cocos2dx 3.0中已经实现了lua的面向对象
但是如果在别的项目中,实际工程中需要在脚本中进行大量复杂的代码编写,可能会需要自己进行面向对象的实现
关于Lua实现面向对象的方法可以参考这篇 Step By Step(Lua面向对象),已经对于在Lua中面向对象的必要性以及原理进行了仔细的讲解
这里就直接给出一份能使用的面向对象的代码,这里的代码出自quick-cocos2dx,该团队现在也负责cocos2d的lua部分
这里的代码实现了类的创建以及类的继承
function class(classname, super)
local superType = type(super)
local cls
if superType ~= "function" and superType ~= "table" then
superType = nil
super = nil
end
if superType == "function" or (super and super.__ctype == 1) then
-- inherited from native C++ Object
cls = {}
if superType == "table" then
-- copy fields from super
for k,v in pairs(super) do cls[k] = v end
cls.__create = super.__create
cls.super = super
else
cls.__create = super
cls.ctor = function() end
end
cls.__cname = classname
cls.__ctype = 1
function cls.new(...)
local instance = cls.__create(...)
-- copy fields from class to native object
for k,v in pairs(cls) do instance[k] = v end
instance.class = cls
instance:ctor(...)
return instance
end
else
-- inherited from Lua Object
if super then
cls = {}
setmetatable(cls, {__index = super})
cls.super = super
else
cls = {ctor = function() end}
end
cls.__cname = classname
cls.__ctype = 2 -- lua
cls.__index = cls
function cls.new(...)
local instance = setmetatable({}, cls)
instance.class = cls
instance:ctor(...)
return instance
end
end
return cls
end
在使用时,首先进行类的创建
local TestClass = class("TestClass")
-- 重写构造函数
function TestClass:ctor(a,b)
self.a = a
self.b = b
end
-- TestClass的成员函数
function TestClass:setA(a)
self.a = a
end
function TestClass:returnA()
return self.a
end
实例的生成以及使用如下
testClass = TestClass.new(10,5) --这里会自动调用ctor函数,并把参数传入
testClass:setA(1)
testClass:returnA()
如果要继承TestClass类,只要这样写就行
local TestClassSon = class("TestClassSon",TestClass)
这里要注意“.”和“:”的使用,在Lua语言中
object:testFunc()
相当于
object.testFunc(object)
在testFunc函数内,用self取输入的object参数