Lua教程-面向对象

Lua教程已接近尾声预计再有两章,从最开始对Lua的不熟悉到现在把所有Lua的基础知识都讲解出来,其实最开始在做与nginx结合限流才有这个想法,如果想着实现比较复杂的逻辑,还是要代码的,所以就想着把Lua教程分享出来。

面向对象特征

  1. 封装:把一个实体的信息封装到一个对象中。
  2. 继承:在不改变原有程序的基础上进行扩展,有利于减少代码重复提高开发效率。
  3. 多态:同一操作作用在不同的对象上,产生不同的结果。
    接下来介绍下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中不建议使用,在这里演示下。

  1. 创建父类 base.lua
local _M = {}
local mt = {__index = _M}
function _M:upper(s)
    return string.upper(s)
end

return _M
  1. 创建子类change.lua继承父类
local base = require("base")
local _M = {}
_M = setmetatable(_M , {__index = base})

function _M:lower(s)
    return string.lower(s)
end

return _M
  1. 创建测试类testchange.lua
local change = require("change")

print(change:upper("s"))
print(change:lower("A"))

输出结果:

S
a

好了关于面向对象就说这么多了,可以自行测试或者扩展更多的功能,也可以关注我的个人公众号一起学习。


Lua教程-面向对象_第1张图片

你可能感兴趣的:(Lua,Lua基础教程)