Lua教程已接近尾声预计再有两章,从最开始对Lua的不熟悉到现在把所有Lua的基础知识都讲解出来,其实最开始在做与nginx结合限流才有这个想法,如果想着实现比较复杂的逻辑,还是要代码的,所以就想着把Lua教程分享出来。
面向对象特征
- 封装:把一个实体的信息封装到一个对象中。
- 继承:在不改变原有程序的基础上进行扩展,有利于减少代码重复提高开发效率。
- 多态:同一操作作用在不同的对象上,产生不同的结果。
接下来介绍下Lua如何实现面向对象的,在开始前先说下点和冒号的区别:
符号 | 说明 |
---|---|
. | 需要接受self参数 |
: | 默认传入self |
在举例中会对两种表示方式进行说明。
点的方式实现
这种方式是定义一个table,然后返回该table。
local _M = {
username = "zhangsan" ,
age = 30
}
function _M.getusername(self)
return self.username
end
function _M.getage(self)
return self.age
end
return _M
测试demo
local sharep = require("sharep")
local username = sharep.getusername(sharep)
print(username)
local age = sharep.getage(sharep)
print(age)
输出结果为:
zhangsan
30
冒号的方式实现
定义circle文件
local _M = {
rate = 3.14,
lang = 1
}
local mt = {__index = _M}
function _M:new()
setmetatable(_M , mt)
return _M
end
function _M:area(lang)
self.lang = lang
local area = self.rate * (lang/2) * (lang/2)
return area
end
return _M
测试demo
local r = require("circle")
local round = r:new()
local area = round:area(10)
print(area)
输出结果:
78.5
继承
继承可以用元表进行表示,可以使用父类中的方法和变量,但是在Lua中不建议使用,在这里演示下。
- 创建父类 base.lua
local _M = {}
local mt = {__index = _M}
function _M:upper(s)
return string.upper(s)
end
return _M
- 创建子类change.lua继承父类
local base = require("base")
local _M = {}
_M = setmetatable(_M , {__index = base})
function _M:lower(s)
return string.lower(s)
end
return _M
- 创建测试类testchange.lua
local change = require("change")
print(change:upper("s"))
print(change:lower("A"))
输出结果:
S
a
好了关于面向对象就说这么多了,可以自行测试或者扩展更多的功能,也可以关注我的个人公众号一起学习。