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