Lua中本没有面向对象的特性,tolua++是一种第三方的软件包,可以为Lua提供面向对象的特性,这样就可以使用Lua来编写使用c++语言库的脚本文件
封装
定义一个User.lua文件
-- 一个类的头,此处的类名不一定非要和文件名保持一致,但为了规范性,一般都会一致。
local User = class("User")
--定义成员变量
User.id = 1
User.name = "张三"
User.age = 20
--构造方法,在Lua语言中,所有的ctor()方法都叫构造方法。所以会首先调用类的ctor()方法
function User:ctor()
print("User被构造")
end
--重载 后写的方法会覆盖之前的方法
function User:ctor(name)
User.name = name
print("调用有参数的构造方法")
end
--这种写法与User类无关,调用不了;
function fun()
end
--成员方法,必须加 文件名+:
function User:fun()
print("这是User的成员方法")
end
function User:setId(id)
-- self.id --表示成员变量
-- User.id --表明静态的成员变量
User.id = id
end
function User:getId()
return User.id
end
--一个类的尾
return User
在别的Lua文件中调用
--先定义一个成员变量,此处classUser就是类名,如果要实例化,就用classUser
local classUser = require("app.scenes.User")
function DingyiFile:ctor()
--实例化并赋值给一个变量
local user = classUser.new()
---------------------------------------------
此时运行程序,会有日志:User被构造
---------------------------------------------
local user 1= classUser.new()
print(user.name)
print(user1.name)
---------------------------------------------
此时运行程序,结果:
User被构造
User被构造
张三
张三
---------------------------------------------
user.name = "李四"
print(user.name)
print(user1.name)
--结果:李四 张三
end
--接上面调用
--此时结果是225
user:setId(225)
print(user1:getId())
如果User.lua文件中的setId 和getId方法换成另外一种方式,则上面的输出结果变为:1 此时user:getId = 225.
但是这种方式不能使用user.setId方式赋值和user.getId取值,不然会报错。
比如在user.setId方法中
:表示参数传了一个self和一个id,调用自己的成员函数
使用 . 访问时,self 无效,相当于调用静止函数
function User:setId(id)
self.id = id
end
function User:getId()
return self.id
end
继承 (单继承)
如果定义一个teache类,继承自User类
local User = require("app.scenes.User")
--单继承
local Teacher = class("Teacher",User)
function Teacher : ctor()
--Lua中构造方法不会自动调用父类的构造方法
self.super:ctor() --调用父类的构造方法
print("Teacher被构造了")
end
return Teach
多态
由于Lua是一种弱指针语言,所以没有多态特性。