lua模拟面向对象编程

2018-05-11 19:39:08

lua中跟对象和类最像的就是表格有方法和属性,所以类和对象都只能用表格来模拟
声明一下,其实表格的功能已经能应付大部分场景了,而且lua脚本语言本就不是面向对象语言(它的优势是轻量级简单快速),硬要模拟面向对象有时候会搞得不伦不类,所以以下只为学习,不建议应用到正式环境。

例子

--声明一个基类Web
local Web = {name='freecls', url='http://www.freecls.com', dt='2018', server='aliyun'}
function Web:say_name()
    print(self.name)
end

function Web:say_url()
    print(self.url)
end

function Web:new(name,url)
    local o = {}
    setmetatable(o,self)
    
    --将o的元表的__index元方法设置成Web
    --那么o中没有的属性就会去Web表格中寻找
    self.__index = self
    
    --如果传递了name,url就设置到表格o里
    --如果没有就沿用Web里面的内容
    if name ~= nil then o.name = name end
    if url ~= nil then o.url = url end
    
    return o
end


local w1 = Web:new('沧浪水')

--沧浪水	http://www.freecls.com	2018	aliyun
print(w1.name, w1.url, w1.dt, w1.server)

w1:say_name()       --沧浪水



local w2 = Web:new('戴磊', 'http://www.freecls.com/u/info/2712')

--戴磊	http://www.freecls.com/u/info/2712	2018	aliyun
print(w2.name, w2.url, w2.dt, w2.server)

w2:say_name()       --戴磊


模拟继承

--声明一个基类Web
--注意这个Web表格为了能被继承改动了很多
local Web = {name='freecls', url='http://www.freecls.com', dt='2018', server='aliyun'}
function Web:say_name()
    print(self.name)
end

function Web:say_url()
    print(self.url)
end

function Web:new(name,url)
    local o = {}
    setmetatable(o,self)
    
    --将o的元表的__index元方法设置成Web
    --那么o中没有的属性就会去Web表格中寻找
    self.__index = self
    
    if name ~= nil then o.name = name else o.name = self.name end
    if url ~= nil then o.url = url else o.url = self.url end
    o.dt = self.dt
    o.server = self.server
    
    o.say_name = self.say_name
    o.say_url = self.say_url
    
    return o
end


local Web1 = {age=22,sex='男'}

function Web1:how_old()
    print(self.age)
end

--模拟继承
function Web1:new(age,sex)
    local o = Web:new()
    setmetatable(o, self)
    self.__index = self
    
    return o
end

local w1 = Web1:new()
w1.name = '沧浪水'

--22	男	沧浪水	http://www.freecls.com	2018	aliyun
print(w1.age, w1.sex, w1.name, w1.url, w1.dt, w1.server)

w1:say_url()        --http://www.freecls.com
w1:say_name()       --沧浪水
w1:how_old()        --22


模拟重写

local Web = {name='freecls', url='http://www.freecls.com', dt='2018', server='aliyun'}
function Web:say_name()
    print(self.name)
end

function Web:say_url()
    print(self.url)
end

function Web:new(name,url)
    local o = {}
    setmetatable(o,self)
    
    --将o的元表的__index元方法设置成Web
    --那么o中没有的属性就会去Web表格中寻找
    self.__index = self
    
    if name ~= nil then o.name = name else o.name = self.name end
    if url ~= nil then o.url = url else o.url = self.url end
    o.dt = self.dt
    o.server = self.server
    
    o.say_name = self.say_name
    o.say_url = self.say_url
    
    return o
end


local Web1 = {age=22,sex='男'}

function Web1:how_old()
    print(self.age)
end

--这个方法会失效,重写失败
function Web1:say_name()
    print(self.name..' 重写')
end

--模拟继承
function Web1:new(age,sex)
    local o = Web:new()
    setmetatable(o, self)
    self.__index = self
    
    --重写成功
    function o:say_name()
        print(self.name..' 重写')
    end
    
    return o
end

local w1 = Web1:new()
w1.name = '沧浪水'

--22	男	沧浪水	http://www.freecls.com	2018	aliyun
print(w1.age, w1.sex, w1.name, w1.url, w1.dt, w1.server)

w1:say_url()        --http://www.freecls.com
w1:say_name()       --沧浪水 重写
w1:how_old()        --22


总结

1.本文只是对lua模拟面向对象做简单的介绍,如果有疑问可以给我留言
2.lua的版本为5.1,运行环境centos7 64位
3.原文地址http://www.freecls.com/a/2712/1b

©著作权归作者所有
收藏
推荐阅读
  • lua元表

    lua元表其实就是为了扩展表格间的运算,比如之前我们如果让2个表格相加就会报错,一旦我们设置了元表并加上了__add属性,那么就会正常执行。先看2个元表相关的函数setmetatable(table,...

  • lua模块编写

    lua允许我们编写自定义模块以便后面调用,在编写模块之前我们先认识2个知识点1.lua语言中数组,模块其实都是table表格。2.在之前的lua基本语法里我们知道函数是可以赋值给变量的好,我们新建一个...

  • lua基本语法

    变量1.变量无需声明2.变量没声明为nil,赋值为nil等同于删除3.lua把nil,false视为假,其他都为true4.Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显...

  • lua基础函数 type,tonumber,tostring,pcall,print

    type(v)用来判断v的类型返回字符串"nil", "number", "string", "boolean", "table", "function", "thread", "userdata"t...

  • lua ipairs pairs

    这两个函数都是用来遍历表格数组的,性能几乎没有区别,其他区别如下:iparis只会遍历数字索引,并在遇到第一个非数字索引时终止paris则会遍历所有例子  local t = {22,33,...

  • nginx模块 ngx_http_headers_module

    ngx_http_headers_module 模块是用来增加 Expires 和 Cache-control,或者是任意的响应头。Syntax: add_header name value [alw...

  • nginx模块 ngx_http_gunzip_module、ngx_http_gzip_module、ngx_http_gzip_static_module

    ngx_http_gunzip_module 模块将文件解压缩后并在响应头加上 "Content-Encoding: gzip" 返回给客户端。为了解决客户端不支持gzip压缩。编译的时候带上 --w...

  • nginx模块 ngx_http_flv_module、ngx_http_mp4_module

    ngx_http_flv_module模块提供了对 flv 视频的伪流支持。编译的时候带上 --with-http_flv_module。它会根据指定的 start 参数来指定跳过多少字节,并在返回数...

  • nginx模块 ngx_http_fastcgi_module

    ngx_http_fastcgi_module 模块使得nginx可以与 fastcgi 服务器通信。比如目前要使得 nginx 支持 php 就得使用 fastcgi技术,在服务器上装上 nginx...

  • nginx模块 ngx_http_autoindex_module

    ngx_http_autoindex_module 模块可以将uri以 / 结尾时,列出里面的文件和目录。Syntax: autoindex on | off; Default: autoindex ...

简介
天降大任于斯人也,必先苦其心志。