您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-Lua之面向对象的封装

2016-06-18 09:40 429 查看
Lua作为一门脚本语言,不同于C++,java这类的高级语言,Lua中的面向对象只能通过封装与继承(只能是单继承)实现,并没有多态,连重载都不支持的Lua拿什么资本支持多态呢。

先说一下类的格式:

local 类名 = class("类名")

--类内部定义的成员函数和成员变量

return 类名


举个例子:

--UsrClass.lua文件
local Usr = class("Usr")

--id,name,age分别为类Usr的成员变量
Usr.id = 1
Usr.name = "张三"
Usr.age = 20

--ctor是必须遵守的构造函数的名称
function Usr:ctor(name, num, age)
self.name = name
self.id = num
self.age = age
end

--类Usr自定义的成员函数
function Usr:getinfo()
print("姓名: " .. self.name .. "    id:" .. self.id .. "年龄:" .. self.age)
end

return Usr


--test.lua文件
local UsrClass = require("app.scenes.UsrClass")

local usr1 = UsrClass.new("郭靖", 101, 18)
local usr2= UsrClass.new("黄蓉", 102, 16)

usr1:getinfo()
usr2:getinfo()


输出结果:



构造对象:

类.new()


在成员函数中访问自己的成员时要:

self.成员变量   --前加self进行访问


如果用下面这种格式:

类名.成员变量


这就相当于C++中的静态成员变量,对所有对象是公用的。

要访问self的成员,就必须用:

对象:成员函数


这种方式访问。

如果用:

对象.成员函数


就只能访问只访问静态成员变量的函数,也可以叫静态成员函数。

下面都改成静态的试试看:

--UsrClass.lua文件
local Usr = class("Usr")

--id,name,age分别为类Usr的成员变量
Usr.id = 1
Usr.name = "张三"
Usr.age = 20

--ctor是必须遵守的构造函数的名称
function Usr:ctor(name, num, age)
Usr.name = name
Usr.id = num
Usr.age = age
end

--类Usr自定义的成员函数
function Usr:getinfo()
print("姓名: " .. self.name .. "    id:" .. self.id .. "年龄:" .. self.age)
end

return Usr


--test.lua文件
local UsrClass = require("app.scenes.UsrClass")

local usr1 = UsrClass.new("郭靖", 101, 18)
local usr2= UsrClass.new("黄蓉", 102, 16)

usr1:getinfo()
usr2:getinfo()


输出结果:



可以看到在构造函数里改成静态成员变量之后,即使usr1自定义了姓名,编号和年龄,usr2一定义就覆盖了原来的,因为修改的公共的成员,而不再是个人的了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: