lua继承

在 Lua 开发中,为了组织复杂逻辑,我们通常需要引入面向对象。
这段代码实现了一个轻量、高效的基类 Object,它支持实例化、继承、混入(Mixin)以及类型检查。

基类定义

1
2
3
---@class Object
Object = {}
Object.__index = Object
  • Object 是一个表,作为所有对象的基类。
  • __index 元方法指向 Object 本身,使得实例可以访问基类的方法。

构造函数和实例化

1
2
3
4
5
6
7
8
9
function Object:new()
end

---新建一个对象
function Object:__call(...)
local obj = setmetatable({}, self)
obj:new(...)
return obj
end
  • Object:new() 是一个空方法,子类可以重写它来实现自己的构造逻辑。
  • Object:__call(...) 使得 Object 可以像函数一样被调用来创建实例。它创建一个新的表,设置其元表为 Object,然后调用 new 方法进行初始化。

继承机制

1
2
3
4
5
6
7
8
9
10
11
12
13
function Object:extend()
local cls = {}
-- 1. 复制父类的元方法
for k, v in pairs(self) do
if k:find("__") == 1 then
cls[k] = v
end
end
cls.__index = cls
cls.super = self -- 记录父类
setmetatable(cls, self) -- 设置元表指向父类,实现方法继承
return cls
end
  • 元方法继承:通过复制父类的元方法(以 __ 开头的方法),确保子类也能使用这些特殊行为。
  • cls.super 记录父类,方便子类调用父类方法。
  • setmetatable(cls, self) 设置子类的元表为父类,实现方法继承。

    混入(Mixin)功能

    使用 implement 方法可以将多个类的功能混入当前类,增强代码复用性。
1
2
3
4
5
6
7
8
9
function Object:implement(...)
for _, cls in pairs({...}) do
for k, v in pairs(cls) do
if self[k] == nil and type(v) == "function" then
self[k] = v -- 将函数拷贝到当前类
end
end
end
end
  • implement 方法接受多个类作为参数,将它们的函数复制到当前类中,前提是当前类没有同名函数。
  • 这使得我们可以轻松地将不同类的功能组合在一起,而不需要通过复杂的继承层次结构。

类型检查

1
2
3
4
5
6
7
8
9
10
function Object:is(T)
local mt = getmetatable(self)
while mt do
if mt == T then
return true
end
mt = getmetatable(mt) -- 沿着元表链向上递归查找
end
return false
end
  • is 方法用于检查当前对象是否是某个类的实例。它通过沿着元表链向上递归查找来判断对象的类型,支持多层继承关系。

总结

方法的实际寻找过程:

1
2
3
4
5
6
7
obj.hello

obj 没有,去 obj 的元表 Object

obj 的元表 Object.__index = Object

Object.hello 找 ✅

lua继承
https://wttch96.github.io/post/lua/lua继承.html
作者
Wttch
发布于
2026年3月30日
许可协议