Lua中的面向对象
1.Lua中类的原理
Lua中没有类的概念,类是一个属性和方法的集合,而方法都是由方法名和方法名映射的方法函数构成,
方法名可以称为键,而值就是方法体的内容所以说类实际上是一个键值对的.那么Lua中的表也是由键
值对构成的,所以可以用lua中的表来模拟面向对象语言中的类.
参考和转载自:链接地址
大佬解释的很清楚,看完以后获益匪浅
2.Lua中的"."和":"
Person ={name ="小明"}
Person2 ={name ="班长"}
Person.talk=function (self,words )
print(self.name.."说"..words)
end
但是为了使语句看起来更加清晰明了,前辈们为它添加了一个语法糖(在不改变功能的基础上,让程序看起来更方便)
于是它变成了下面的这个样子]]
-- function Person.talk(self,words)
-- print(self.name.."说"..words)
-- end
--[[但是对我们程序员来说这个写起来还可以更加方便简洁(懒),于是有了下面的样子]]
-- function Person:talk(words)
-- print(self.name.."说:"..words) --变得和C#中的this变得更加形象
-- end
-- Person:talk("老师你别说了我出去")
-- Person.talk(Person,"别想我")
-- Person.talk(Person2,"赶紧的,滚犊子!")
--比起上面的代码多了一个点,少了一个self,却依然可以使用self,不过这个self只能指代自己
--[[
3.Lua如何查找表中的元素
查找表中的元素类似于查找类中的属性和方法
如果我们要在P表中查找talk这个键所对应的值,请看以下粘贴内容:
matetable叫做元表,原表的作用就是增加和改变表的既定操作,只有设置过的表才会收到原表的影响从而改变自身行为
它具以下两个全局方法:
setmetatable(t,m) 将表t的元表设置为表m
getmetatable(t) 通过t获得它的原表m
元方法
元表作为一个表,可以拥有任意类型的键值对,其真正对被设置的表的影响是Lua规定的元方法键值对。这些键值对就是
Lua所规定的键,比如前面说到的__index,__add,__concat等等。这些键名都是以双下划线__为前缀。其对应的值
则为一个函数,被称为元方法.
例:
-- m = {}
-- m.__index = function (table,key)
-- return "undefined"
-- end
-- pos = {x=1,y=2}
-- print(pos.z)
-- setmetatable(pos,m)
-- print(pos.z)
--元表的__index属性实际上是给表配备了找不到键时的行为。
--注意:元表的__index属性对应的也可以为一个表。
-- local m = {
-- __add = function (t1,t2) --下划线两下
-- local sum = {}
-- for k,v in pairs(t1) do
-- sum[k] =v
-- end
-- for k,v in pairs(t2) do
-- print(type(sum[k]))
-- sum[k] = sum[k]+v
-- end
-- return sum
-- end
-- }
-- local table1 = setmetatable({1,2,3,4,5},m)
-- local table2 = setmetatable({6,7,8,10},m)
-- for k,v in pairs(table1 + table2) do
-- print(k,v)
-- end
--元表的__add属性是给表定义了使用+号时的行为。
4.类的实现
Person={}
--模拟面向对象的构造函数
function Person:New(name)
local p = {} --设置类的实例
Person.__index = Person --设置index为自身
setmetatable(p,Person) --person设置为p的元表
p.name = name
return p
end
--talk方法
function Person:talk(words)
print(self.name.."说:"..words)
end
local p1 = Person:New("路人甲")
p1:talk("我是路人甲")
网友评论