cocos2d-x lua 中集成了tolua++,所以在cocos2d-x lua实际开发中,可以直接用利用其面向对象特性,包括 封装@H_301_3@ 和 继承@H_301_3@,无多态
类实例
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
对于其它的成员方法,也是如此。
当然子类可以 调用父类的成员变量和方法
========