阅读本文需求有一定的前置知识,比如什么是面向对象,这边就不再赘述,本文用几个简单的例子讲述下在lua语言环境下的面向对象。

创建基类

下面拆解下这个函数,下面这段代码定义在animal.lua文件中。其中实现了一个new函数,new函数默认没有对象会创建一个新表,并且将self作为这个新表的元方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
animal = {}
function animal:Talk(content)
print("animal:Talk->" .. content)
end

function animal:new(obj)
obj = obj == nil and {} or obj
self.__index = self --前面的self是指new参数列表中缺省的self,
setmetatable(obj, self)
return obj
end


return animal

创建子类Cat继承基类animal

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
local anim = require("animal")
cat = anim:new()
-- cat.__index = cat --可以这样设定当前的__index指向

function cat:CatTalk(content)
print("cat:CatTalk->" .. content)
end

function cat:new(obj)
obj = obj == nil and {} or obj

-- setmetatable(obj, {__index = self})
-- 方法1. 将index__索引的目标指向当前文件,坏处是每次都要构建一张表

self.__index = self --可以这样设定当前的__index指向
setmetatable(obj, self)
--方法2. 将self直接作为obj的元表,如果出现找不到函数/字段会从当前文件中找。
return obj
end


return cat

测试脚本

子类继承了基类的 Talk 函数,并且调用输出了自己的CatTalk函数。

1
2
3
4
5
6
7
8
9
local cat = require("cat")
local c = cat:new()
c:Talk("hello world")
c:CatTalk("hello world")

--------输出------
PS D:\lua> lua .\test1.lua
animal:Talk->hello world
cat:CatTalk->hello world