cocos2d-x lua 中集成了tolua++,所以在cocos2d-x lua实际开发中,可以直接用利用其面向对象特性,包括 封装 和 继承,无多态
类实例
User.lua
local User = class("User")
User.id = 1
User.name = "张三"
User.age = 20
function User:ctor() --构造方法
print("User construct")
end
function User:fun()
printf("a method of User")
end
function User:setId(id)
self.id = id
end
return User
test.lua
local User = require("User")
local u1 = User.new()
u1:fun()
一些注意问题
* 定义类
local User = class("User")
return User
注意一定要return,直接按照要求定义一个类就行了
* lua类 不支持 函数重载
* 构造函数
function User:ctor() --构造方法
print("User construct")
end
类:ctor() , 也可以用带参数的构造函数
如果定义了多个构造函数,则之后调用最后加载的那个构造函数,因为没有函数重载,自然也不会有多个构造函数
* 成员方法,成员变量
function User:fun() printf("a method of User") end
local function fun()
end
对于成员变量 直接是self.成员变量,如下是对静态成员的设置
function User:setId(id)
self.id = id
end
如果改成
function User:setId(id)
User.id = id
end
那么 id会成为 一个类似C++中的静态成员,即所有的对象都有这么一个Id(同一块内存空间)
* 使用冒号(:) 和 点(.) 的区别和注意点
冒号(:) 相当于有一个self,能对成员方法访问
点(.) 相当于访问静态方法一样,没有self
这个问题,在初学时经常会犯错,类似如下的这种错误,可能就需要好好检查下代码了
lua类继承(单继承)
Teacher.lua
local User = require("User")
local Teacher = class("Teacher",User)
return Teacher
如上,Teacher 类 继承 User类
比如在 cocos2d-x lua中,见到的MainScene,就继承了场景类,这样它就是个场景了
local MainScene = class("MainScene",function()
return display.newScene("MainScene")
end)
-- TODO...
return MainScene
继承之后的问题
function Teacher:ctor() print("Teacher construct") end
function Teacher:ctor()
self.super:ctor() -- self不要忘记
-- TODO 子类自己的构造函数的逻辑代码
end
对于其它的成员方法,也是如此。
当然子类可以 调用父类的成员变量和方法
========