You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua继承示例异常:无法创建多个SpecialAccount实例

问题原因及解决方案

核心问题在于你直接将SpecialAccount这个类表传给了Account:new()方法,而Account的new逻辑是直接使用传入的o作为实例返回——也就是说s就是SpecialAccount本身,根本没有创建新的独立实例,自然无法生成多个SpecialAccount实例。

正确的实现步骤

要实现子类创建多个实例,需要先让SpecialAccount成为Account的子类,再通过子类的new方法创建实例:

  1. 让SpecialAccount继承Account
    先调用Account:new()生成一个继承自Account的新表,作为SpecialAccount的类表,而不是直接定义一个独立表。
  2. 给SpecialAccount添加自定义属性和方法
    在继承后的SpecialAccount上添加专属的balance和special_receipt方法。
  3. 通过SpecialAccount创建实例
    调用SpecialAccount:new()来生成独立的实例,此时每个实例都是全新的表,不会和SpecialAccount类表混淆。

修正后的完整代码

Account = {
  balance = 50,
  receipt = function(self)
    print(self.balance)
  end,

  new = function(self, o)
    local o = o or {}
    setmetatable(o, self)
    self.__index = self
    return o
  end
}

-- 让SpecialAccount继承Account,成为子类
SpecialAccount = Account:new()
-- 添加子类专属属性和方法
SpecialAccount.balance = 150  
SpecialAccount.special_receipt = function(self)
  print(self.balance)
  print("This is special!")
end  

-- 测试创建多个独立实例
s1 = SpecialAccount:new()
s2 = SpecialAccount:new()

print(tostring(SpecialAccount))
print(tostring(s1))
print(tostring(s2))

s1:receipt()
s1:special_receipt()

-- 修改s1的balance,验证实例独立性
s1.balance = 200
print("s1 balance:", s1.balance)
print("s2 balance:", s2.balance)
print("SpecialAccount balance:", SpecialAccount.balance)

修正后逻辑说明

  • SpecialAccount = Account:new()会生成一个新表,其元表指向Account,因此自动继承Account的所有方法和属性。
  • 给SpecialAccount添加自定义内容时,只会影响这个子类表,不会修改父类Account。
  • 调用SpecialAccount:new()时,会创建全新的实例表,每个实例的元表指向SpecialAccount,既继承子类的特性,又保持实例之间的独立性。

内容的提问来源于stack exchange,提问作者user1511417

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:05:33