解说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中运用面向对象的思想,实现类的定义、实例化以及类的继承等面向对象编程的核心功能。