Lua学习之五面向对象

Lua里面自带是没有面向对象的,但是可以这么实现
面向对象,学习路径应该是这样子的:

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学习之七源码





你可能感兴趣的:(Lua,Lua入门教程)