0Pricing
Lua Academy · 课时

多级继承

通过正确的 __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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 基类和构造函数设计
  2. 多级继承
  3. 混入组合和接口检查
  4. instanceof 和类型自省
← 返回 Lua Academy