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 , 直接按照要求定义一个类就行了
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
这个问题,在初学时经常会犯错, 类似如下的这种错误,可能就需要好好检查下代码了
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
继承之后的问题
构造函数,如果不写,这会调用父类的构造函数
若写法如下, 则子类构造方法 覆盖了 父类的构造方法,即Teacher.new()不会调用父类的构造函数
function Teacher:ctor() print("Teacher construct") end
function Teacher:ctor()
self.super:ctor() -- self不要忘记
-- TODO 子类自己的构造函数的逻辑代码
end
对于其它的成员方法,也是如此。
当然子类可以 调用父类的成员变量和方法
========