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





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
 本套课程分为基础与中级两部分,分别就lua语言的各方面知识点进行探讨,学习完本套课程,对于后续Xlua(Tolua等框架)技术的学习提供强大的语言技术保证。       本套lua课程采用入门与商业级两种开发IDE进行教学:入门级的SciTE内置IDE与商业级的IDEA lua插件。本套课程学习完毕,对于除了传统手游外,在VR、AR、商业级大型应用程序、嵌入式设备开发等领域都有较强的指导作用。           《lua中级篇》分为:“函数的进阶”、“字符串进阶”、“Table进阶”、“元表”、“OOP面向对象”、“协同程序”、“IO操作”、“调试与运行”等八个大的章节,详细深入讲解lua开发的方方面面。        内容包含lua可变参数、闭包、模块、函数尾调用、字符串模式匹配、字符串不变性原理、矩阵、链表、元表详解与应用、协同的生命周期与生产消费者问题、lua文件各种读写操作、lua执行外部代码与错误异常处理垃圾收集机制等。       最后,lua中级篇的学习,对于广大学员开发商业级lua热更新技术,具有不可替代的重要作用! 热更新系列(技术含量:中高级):B:《热更新框架设计之Xlua基础视频课程》https://edu.csdn.net/course/detail/27110C:《热更新框架设计之热更流程与热补丁技术》https://edu.csdn.net/course/detail/27118D:《热更新框架设计之客户端热更框架(上)》https://edu.csdn.net/course/detail/27132E:《热更新框架设计之客户端热更框架(中)》https://edu.csdn.net/course/detail/27135F:《热更新框架设计之客户端热更框架(下)》https://edu.csdn.net/course/detail/27136 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值