面向对象不是针对某一门语言,而是一种思想,在面向过程的语言也可以使用面向对象的思想来进行编程。在Lua中,并没有面向对象的概念存在,没有类的定义和子类的定义,但同样在Lua中可以利用面向对象的思想来实现面向对象的类继承。

一、复制表的方式面向对象

–Lua中的面向对象

–[[

复制表方式面向对象

参数为一张表,通过遍历这张表取值,赋给一张空表,最后返回新建的表,来达到克隆表

]]

function clone(tab)

local ins = {}

for key, var in pairs(tab) do

ins[key] = var

end

return ins

end

–[[

复制表

第一参数是目标表,第二个参数是需要复制的表

通过遍历tab来取值将它赋值到目标表中

]]

function copy(dist,tab)

for key, var in pairs(tab) do

dist[key] = var

end

end

— 定义一张空表,相当于一个类

People ={}

–function People.sayHi()

— print(“People say hi”)

–end

— 定义类中的方法sayHi,传入一个self参数

People.sayHi = function (self)

print(“People say hi:”..self.name)

end

— 定义一个new方法,传进一个name参数,通过克隆People这张表来生成一个对象

— 相当于类当中的一个构造方法

People.new = function (name)

local self = clone(People)

self.name = name

return self

end

–local p = clone(People)

–p.sayHi()

–生成一个新的对象

local p = People.new(“ZhangSan”)

–p.sayHi(p)

–p:sayHi()

–定义一张空表,也代表一个类

Man = {}

–Man中的构造方法,实现Lua中类的继承

Man.new = function (name)

local self = People.new(name)

–附加Man中所有的键值对到People中的实例中去

copy(self,Man)

return self

end

Man.sayHello = function ()

print(“Man say hello”)

end

–重写父类People中的sayHi方法

Man.sayHi = function (self)

print(“Man sayHi “..self.name)

end

–创建Man的一个实例

local m = Man.new(“Lisi”)

m:sayHi()

二、使用函数闭包的形式实现面向对象

–以函数闭包的形式实现面向对象

–定义一个方法,函数闭包实现一个类的概念

function People(name)

local self = {}

–初始化方法,私有的

local function init()

self.name = name

end

self.sayHi = function ()

print(“Hello “..self.name)

end

–调用初始化

init()

return self

end

–实例化一个对象

local p = People(“ZhangSan”)

p:sayHi()

–函数闭包的形式实现类继承

function Man(name)

local self = People(name)

— local function init()

— end

self.sayHello = function ()

print(“Hi “..self.name)

end

return self

end

local m = Man(“Lisi”)

–m:sayHello()

m:sayHi()