解说Lua中的面向对象

2015年03月24日 15:52 0 点赞 0 评论 更新于 2025-11-21 18:29

面向对象是一种编程思想,并非特定于某一门编程语言,即使在面向过程的语言中,也可以运用面向对象的思想进行编程。在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 = {}

-- 定义类中的方法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 = People.new("ZhangSan")
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)
self.sayHello = function ()
print("Hi " .. self.name)
end
return self
end

local m = Man("Lisi")
m:sayHi()

通过上述两种方式,我们可以在Lua中运用面向对象的思想,实现类的定义、实例化以及类的继承等面向对象编程的核心功能。

作者信息

menghao

menghao

共发布了 3994 篇文章