0Pricing
Lua Academy · 课时

混入组合和接口检查

混合多个行为表,并验证接口一致性。

混入组合和接口检查 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。

什么是混入模块

混入模块是复制到类中的方法表。它们无需继承关系即可提供行为,非常适合横切关注点。

简单应用混入模块

将混入表中的方法复制到目标类中。

local Serializable = {
  serialize = function(self)
    local parts = {}
    for k, v in pairs(self) do
      parts[#parts+1] = k .. "=" .. tostring(v)
    end
    return "{" .. table.concat(parts, ", ") .. "}"
  end
}
local function mixin(cls, ...)
  for _, m in ipairs({...}) do
    for k, v in pairs(m) do
      if cls[k] == nil then cls[k] = v end
    end
  end
end
mixin(Animal, Serializable)
print(cat:serialize())

覆盖与不覆盖

确定混入模块是否应覆盖现有方法。上面的示例使用 if cls[k] == nil 来防止覆盖。移除该检查即可允许覆盖。

多个混入模块

将多个混入模块应用于一个类,以组合来自多个来源的行为。

local Printable = { print = function(self) print(tostring(self)) end }
local Comparable = { eq = function(self, other) return self.id == other.id end }
mixin(User, Serializable, Printable, Comparable)

接口定义

接口是一个列出所需方法名称的表。您可以使用它记录类必须履行的约定。

local IAnimal = {
  "speak",
  "move",
  "eat",
}

接口检查函数

验证类是否实现了接口中的所有方法。

local function implements(cls, interface)
  for _, method in ipairs(interface) do
    if type(cls[method]) ~= "function" then
      return false, "Missing method: " .. method
    end
  end
  return true
end
local ok, err = implements(Dog, IAnimal)
print(ok, err)

严格接口约束

在类定义时(或模块加载时)调用 implements,以便尽早发现缺失的方法。

assert(implements(Dog, IAnimal))

鸭子类型与接口检查

Lua 自然采用鸭子类型(只要有该方法就使用它)。显式接口检查可以为大型团队和公共 API 提供额外的安全性。

带状态的混入模块

混入模块通常应当是无状态的(只包含方法)。如果多个混入模块使用相同的字段名称,带状态的混入模块可能会引发冲突。

有序应用混入模块

当两个混入模块定义同一个方法时,后应用的模块优先。请有意控制应用顺序,以确保行为可预测。

混入模块与继承的选择

对于强烈的属于某类关系,请使用继承。对于可复用的横切行为(日志记录、序列化、相等判断),请使用混入模块。

混入模块问题

与继承相比,混入模块的一项主要优势是什么?

回顾:混入模块与接口

混入模块会将方法复制到类中,以提供横切行为。接口记录所需的方法,并且可以在加载时进行检查。两者结合后,可以突破单继承限制,实现灵活的组合。

常见问题解答

「混入组合和接口检查」课时是免费的吗?

是的 — 「混入组合和接口检查」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。

「混入组合和接口检查」这节课中我会学到什么?

混合多个行为表,并验证接口一致性。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Lua Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「混入组合和接口检查」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Lua Academy 课中编写并运行代码吗?

能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

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