Lua面对对象

--lua开发测试工具 LuaStudio(v9.91) 需要注册才能使用,免费使用30天(那里有个帮助按钮)
--下载地址http://www.luastudio.net/download.htm


print("------------------lua面对对象所需基础知识---------------------")
--基础知识  可参考https://www.cnblogs.com/blueberryzzz/p/8947446.html
--__index 如何理解
--调用table的一个不存在的索引时,
--会使用到元表的__index元方法,__index可以是一个函数也可是一个table。
--例子1
--作为函数:
--将表和索引作为参数传入__index元方法,return一个返回值
local mt = {}
--第一个参数是表自己,第二个参数是调用的索引
mt.__index = function(t,key)
    return "it is "..key
end
t = {1,2,3}
--输出未定义的key索引,输出为nil
print(t.key)
setmetatable(t,mt)
--设置元表后输出未定义的key索引,调用元表的__index函数,返回"it is key"输出
print(t.key)
print("例子1结束")

--[[结果:

nil
it is key
--]]

--例子2
--作为table:
--查找__index元方法表,若有该索引,则返回该索引对应的值,否则返回nil
local mt = {}
mt.__index = {key = "it is key"}
t = {1,2,3}
--输出未定义的key索引,输出为nil
print(t.key)
setmetatable(t,mt)
--输出表中未定义,但元表的__index中定义的key索引时,输出__index中的key索引值"it is key"
print(t.key)
--输出表中未定义,但元表的__index中也未定义的值时,输出为nil
print(t.key2)
print("例子2结束")
--[[结果:

nil
it is key
nil
--]]


print("------------------------面对对象---------------")

--面对对象创建类
--基本参考可查看 https://www.cnblogs.com/msxh/p/8469340.html
--创建类
--super指的是基类  classname指的是类名
function BaseClass(classname,super) 
	local self = {}
	
	--此处可以做下安全判断  对super进行判断
	--todo
	
	--设置元表  以及构造函数
	if super then
		setmetatable(self,super) --将父类作为自己的元表,以便调用父类的方法
		self.super = super  --存一下父类
	else
		self.ctor = function() end --保证第一次创建类有构造函数
	end
	
	--设置元表的__index
	self.__index = self  --设置元表的索引,想要模拟类的话这部操作很关键
	self.classname = classname --存一下类名

	--构造方法  --实例化一个类对象
    function self:new(...)
		local instance = setmetatable({},self)--自身找不到就会调用元表的__index
		instance.class = self --存储下所属类
		instance:ctor(...) --调用构造函数
		return instance
	end
	
	return self
end

local Person = BaseClass("Person") --创建了一个类
function Person:ctor(b)  --类的构造方法
	print(b)
end 
Person.Name = "hhhh"  --类的字段
Person.Heigh = 180

local person = Person:new(1) --实例化类对象
person.Name = "hhhh22"  --修改实例化类的字段

--解释:读取字段过程
--person指的是instance实例,但是实例本身是空table,所以
--会去找元表的__index(已经设置为Person自身了),所以可以取到字段Name和Heigh
print(person.Name) --打印实例化类的字段
print(person.Heigh)
local Man = BaseClass("Man",Person) --实例化类并继承自类Person
function Man:ctor(b)
	print(b)
end 
Man.Age = 1
local man = Man:new(333)
--解释:读取字段过程
--man指的是instance实例,但是实例本身是空table,所以
--会去找元表的__index(已经设置为Man自身了),所以可以取到字段Age
--但是Man取不到字段Name和Heigh,所以又去找Man的元表Person的__index(Person)
--所以可以取到字段Name和Heigh
print(man.Name)
print(man.Heigh)
print(man.Age)

print("------------------------面对对象结束---------------")
--若是对您有所帮助,世界便多了一份你我的温暖
--您的支持将是我的动力,手有余粮的话,一点点赞赏我将开心不已(一毛钱也是极好的)

--若是对您有所帮助,世界便多了一份你我的温暖
--您的支持将是我的动力,手有余粮的话,一点点赞赏我将开心不已(一毛钱也是极好的)

猜你喜欢

转载自blog.csdn.net/weixin_41995872/article/details/105384704