lua self机制、元表、面向对象、继承

self机制

下例代码为例 定义test方法是 a.test(self,n1,n2) 那调用的时候 a.test(a,3,4) 可以显示的传入self

self则代表对象本身

如b 模块定义的test方法  b:test(n1,n2) 调用的时候 b:test(3,4) 这样是隐式的传入了b 可以在test方法中获取到self对象本身  使用b.test(b,3,4) 显示的传入本身也是可以的 你也可以使用b.test(3,4)方式调用 但这样是不会将本身传入到方法里的

self机制要正常运行

(1)定义的函数必须使用:才会有隐式的传递self机制
(2)调用的时候也要使用:

(3)或者是使用b.test(b,3,4)这样子也是可以的

(4)又或者是a.test(a,3,4)这样子也是可以的  

local a = {}

function a.test(self,n1,n2)
	print("a.test", self)
	print(n1,n2)
end
a.test(a, 3, 4)

local b = {}
function b:test(n1,n2)
	print("b:test", self)
	print(n1,n2)
end
b:test(3, 4)
b.test(b, 3, 4)

元表

-两个表相加 第一个参数是一个表 第二个参数也是一个表
-meta_a 叫做a的元表
-元表里面有一个非常重要的key:__index,
-当我们搜索一个表的key的时候 如果在当前的表里面没有搜索到
-lua解释器 会去这个表的元表里面的__index这个key对应的表里面来查找
-注意 这里是优先在当前表查找找不到了才会去元表里面的__index对应的表里面来查找

local a = {
	--name = "bb"
}
local meta_a = {
	__index = {
		name = "zz",
		age = 34,
		sex = 0,
	}
}
setmetatable(a,meta_a)--设置表的元表
print(getmetatable(a))--获取表的元表
print(a.name)

 输出

面向对象

--c/c++ java lua是没有面向对象的语法的
--但是我们可以模拟它
local base = {
	sex = 1,
}
function base:test()
	print("base:test")
end

function base:new(instant)
	if not instant then 
		instant = {}
	end

	setmetatable(instant,{__index = self})
	return instant
end
--可以添加其他更多的函数
--base叫做类的表

--做一个类的实例
local bb = base:new({
	name = "zazz",
	age = 20,
})--new 的self 就是这个base表
print("bb.name = "..bb.name)
print("bb.sex = "..bb.sex)
--在new里面把新创建的实例的表的元表变成了base
bb:test()-- test self对象就是我们的b

--面向对象的基本步骤
--(1)定义一个类的表
--(2)定义一个实例的表
--(3)为这个实例的表加一个元表 并且元表__index指向了这个类的表
--(4)利用self基础表的实例:表的函数的时候  隐式的帮我们传递了
--实例的表为self到函数里面

输出

 继承和重载

--继承 基类是 person 子类 :man
--基类
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)
	--如果想要调用基类的重载函数 那么直接显示的调用即可
	person.get_age(self)
end

--为这个man类实例化一个类的表
local p = man:new() --new 的self里面不再是person而是man了
--p的元表里面的__index = 类的表

--调用的时候会在p的元表man里面查找
p:test_man()
--调用的时候会在p的元表man里面查找 找不到了会去 man的元表person里面查找
p:test()

--重载
--调用重载的时候先会去p的元表man查找get_age 找到了
--就不会再去man的元表person里面找了
p:get_age()

输出

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张不爱写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值