在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
版权声明:本文为博主原创文章,转载请注明出处。
面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。 1 -- 定义一个表来模拟对象,将id和name看成的它的属性 2 local person = {id = 2156, name = "yzn",} 3 -- 给对象添加方法 4 function person.sayHello(self) 5 print("你好,我的名字是" .. self.name) 6 end 7 - - 访问属性 8 print(person.id) 9 - - 调用方法 10 person:sayHello() 接下来我们来访问person的属性和调用sayHello方法。发现无论是语法还是效果上面都和Java等其它语言操作对象的方式极其类似。但是值得注意的是我在调用方法的时候person后面用的是冒号(:)来调用sayHello方法,而不是使用一点。这其实是Lua的一个语法糖衣,使用冒号调用的时候Lua会自动将调用者当成函数的第一个参数的实参传递到函数内部去。所以我就没有传递参数给sayHello的self参数那边。 1 person:sayHello()
与 1 person.sayHello(person)
是一样的效果,冒号和点号只是用来决定是否需要手动传递第一个参数而已。 1 -- 定义一个Person表,当成类。添加一个属性id,和一个方法toString 2 Person = { 3 id = "1", 4 toString = function(p) 5 print("id = ", p.id) 6 end 7 } 8 9 -- 给Person再添加一个new函数,用于实例化对象。 10 function Person.new() 11 -- 定义一个表,当成被实例化出来的对象 12 obj = {} 13 -- 设置表的元表 14 setmetatable(obj, Person) 15 -- 设置__index方法为自身 16 Person.__index = Person 17 -- 返回创建的实例对象 18 return obj 19 end 20 21 -- 调用new函数实例化对象 22 local obj = Person.new() 23 -- 访问属性 24 print("obj.id = ", obj.id) 25 -- 调用方法 26 obj:toString() 其实Lua中就是通过设置元表的方式来实现继承关系的,这里所谓的类和对象,其实就是让一个obj表继承Person这个表(设置obj的元表为Person)。然后设置元方法__index为Person,这样我们访问obj的id属性时,它在自己的表中没有找到就会调用元方法__index去元表里面找,也就是去Person里面去找,然后返回了Person的id属性的值,方法调用也是一样的。如果没有设置__index,那么没有找到会直接返回nil。 1 local tab1 = {1, 2, 3} 2 print(getmetatable(tab1)) -- 输出nil 其实所谓的元表就是一个普通的表,我们现在来设置下tab1的元表: 1 local tab1 = {1, 2, 3} 2 -- 定义一个普通的空表作为元表 3 local mt = {} 4 setmetatable(tab1, mt) 5 print(getmetatable(tab1)) -- 输出table 我们甚至可以给上面的mt添加一个项,然后获取出tab1的元表进行dump查看是否就是mt: 1 local tab1 = {1, 2, 3} 2 -- 定义一个普通的空表作为元表 3 local mt = { id = 7, } 4 setmetatable(tab1, mt) 5 dump(getmetatable(tab1)) -- 输出表里面的所有内容 我在quick-player模拟器上面运行,控制台窗口输入的内容如下图所示。 我们可以清晰的看到确实是设置元表成功了。 1 local tab1 = {"a", "b", "c"} 2 -- 定义一个普通的空表作为元表 3 local mt = {} 4 -- 设置tab1的元表为mt 5 setmetatable(tab1, mt) 6 -- 重写元方法 7 mt.__add = function(t1, t2) 8 local t = {} 9 10 for i, v in ipairs(t1) do 11 table.insert(t, v) 12 end 13 14 for i, v in ipairs(t2) do 15 table.insert(t, v) 16 end 17 18 return t 19 end 20 21 -- 定义另一个table 22 local tab2 = {"d", "e",} 23 24 -- 对tab进行加法运算,会触发__add元方法 25 local tab3 = tab1 + tab2 26 -- 打印计算后的结果 27 dump(tab3) 运行后看到打印的tab3的值如下所示: 可见我们重载是成功了,其他的元方法重载和加法的基本一致。
|
请发表评论