self,冒号,点的概念--》元表的概念--》对象的概念--》继承/重载
self,冒号,点的概念
--self,冒号,点
print("面向对象测试-----------------------------------------------------")
--下面的a.test(a,4,6),和b:test(4,6)是等价的
--使用冒号,会默认有self形参
--注意,声明和调用b:test,都是使用冒号
local a = {}
function a.test(self,pam1,pam2)
print("a.test",self)
print(pam1,pam2)
end
a.test(a,4,6)
local b = {}
function b:test(pam1,pam2)
print("b:test",self)
print(pam1,pam2)
end
b.test(4,6)
b:test(4,6)
这里的输出
a.test table: 0D98C898
4 6
b:test 4
6 nil
b:test table: 0D98C780
4 6
table: 0D98C758
元表的概念
-- 元表
local a = {
key1 = "test1"
}
local meta_a = {
__index = {
name = "blake",
age = 34,
sex = 0,
key1 = "test2"
}
}
--两个表相加,第一个参数是第一个表,第二个参数也是表
--第二个表就是第一个表的元表
--setmetatable 相加(设置元表) getmetatable 获取元表
setmetatable(a,meta_a)
print(getmetatable(a))
--元表里面非常重要的key
--特点
--
-- 当我们搜索一个表的key,如果没有找到
-- lua就会去元表的__index里面查找这个key
print(a.key1)
print(a.name)
print(a.name2)
这里的输出
test1
blake
nil
对象的概念
--对象
local base = {}
--成员函数
function base:test()
print("base:test",self)
end
function base:new(instant)
if not instant then
instant = {}
end
setmetatable(instant,{__index = self}) -- 在这里设置的元表
return instant
end
--这样子new出来的对象是不同的
--因为传递进去的instant为nil
local b = base:new()
print("b addr is " ,b)
b:test()
local c = base:new()
c:test()
--这样子new出来的对象是相同的
local instant = {}
local d = base:new(instant)
local e = base:new(instant)
d:test()
e:test()
这里的输出
b addr is table: 0D98CAC8
base:test table: 0D98CAC8
base:test table: 0D98CB40
base:test table: 0D98CF28
base:test table: 0D98CF28
继承/重载
--继承,重载
print("继承,重载 测试-----------------------------------------------------")
local person = {}
--成员函数
function person:test()
print("person:test",self)
end
function person:get_age()
print("person:get_age",self)
end
function person:new(instant)
if not instant then
instant = {}
end
setmetatable(instant,{__index = self}) -- 在这里设置的元表
return instant
end
local man = person:new()
function man:test_man()
print("man:test_man",self)
end
function man:test_man2()
print("man:test_man2",self)
end
function man:get_age()
print("man:get_age",self)
end
local p = man:new()
print("p = ====",p)
p:test_man()
p:test()
--重载
p:get_age()
这里输出
继承,重载 测试-----------------------------------------------------
p = ==== table: 0D98CC08
man:test_man table: 0D98CC08
person:test table: 0D98CC08
man:get_age table: 0D98CC08
Lua学习之一环境搭建:https://blog.csdn.net/cmqwan/article/details/80742135
Lua学习之二基本类型:https://blog.csdn.net/cmqwan/article/details/80742990
Lua学习之三流程控制:https://blog.csdn.net/cmqwan/article/details/80749169
Lua学习之四循环 :https://blog.csdn.net/cmqwan/article/details/80749241
Lua学习之五面向对象:https://blog.csdn.net/cmqwan/article/details/80749348
Lua学习之六模块 :https://blog.csdn.net/cmqwan/article/details/80752806
Lua学习之七源码 :https://blog.csdn.net/cmqwan/article/details/80752873
Lua学习之一环境搭建
Lua学习之二基本类型
Lua学习之三流程控制
Lua学习之四循环
Lua学习之五面向对象
Lua学习之六模块
Lua学习之七源码