多级继承
通过正确的 __index 委托支持深层继承链。
多级继承 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
单继承回顾
通过设置 Child.__index = Parent 可以实现单继承。方法查找过程是:如果子类中没有,就通过 __index 在父类中查找。
扩展类工厂以支持继承
向基类添加一个 :extend() 方法,用于创建与父类关联的子类。
function Animal:extend()
local cls = {}
cls.__index = cls
setmetatable(cls, {__index = self})
cls.super = self
function cls:new(...)
local inst = setmetatable({}, cls)
if inst.init then inst:init(...) end
return inst
end
return cls
end创建子类
创建狗类作为动物类的子类,重写 init 并添加新方法。
local Dog = Animal:extend()
function Dog:init(name)
Dog.super.init(self, name, "Woof")
self.tricks = {}
end
function Dog:learnTrick(trick)
self.tricks[#self.tricks+1] = trick
end
local d = Dog:new("Rex")
d:learnTrick("sit")
d:speak() -- Rex says Woof多级继承链
扩展狗类以创建 GuideDog,形成三级继承链。
local GuideDog = Dog:extend()
function GuideDog:init(name, owner)
GuideDog.super.init(self, name)
self.owner = owner
end
function GuideDog:guide()
print(self.name .. " guides " .. self.owner)
end调用父类方法
请始终通过类引用调用父类方法,而不要通过 self 调用,以避免无限递归。
function Dog:init(name)
Dog.super.init(self, name, "Woof") -- explicit super call
end方法解析顺序
Lua 会沿着 __index 链从底层向上解析方法:GuideDog → 狗类 → 动物类 → nil。找到的第一个方法会生效。
重写方法
在子类中定义同名方法即可重写父类方法。对于部分重写,请显式调用父类方法。
function Dog:speak()
print(self.name .. " barks!")
Dog.super.speak(self) -- also call parent speak
end深度限制
继承链过深会减慢方法查找速度(每一层都会增加一个 __index 步骤)。超过 3 到 4 层时,请优先考虑组合。
检查类成员关系
遍历元表链,以检查实例是否属于某个类。
local function isA(instance, cls)
local mt = getmetatable(instance)
while mt do
if mt == cls then return true end
mt = getmetatable(mt)
end
return false
end
print(isA(d, Dog)) -- true
print(isA(d, Animal)) -- true保留类信息的深复制
深复制实例时,请保留元表,以确保副本仍然是正确类的实例。
何时优先使用组合
对于真正的 is-a 关系(狗类是动物类),请使用继承。对于 has-a 关系或需要灵活混合行为的场景,请使用组合(组件表)。
继承问题
Lua 中的多级继承是如何工作的?
回顾:多级继承
向类工厂添加一个 :extend() 方法,以链接 __index。使用 ClassName.super.method(self, ...) 显式调用父类方法。通过遍历元表链检查成员关系。
常见问题解答
「多级继承」课时是免费的吗?
是的 — 「多级继承」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「多级继承」这节课中我会学到什么?
通过正确的 __index 委托支持深层继承链。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「多级继承」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。