Lua继承示例异常:无法创建多个SpecialAccount实例
问题原因及解决方案
核心问题在于你直接将SpecialAccount这个类表传给了Account:new()方法,而Account的new逻辑是直接使用传入的o作为实例返回——也就是说s就是SpecialAccount本身,根本没有创建新的独立实例,自然无法生成多个SpecialAccount实例。
正确的实现步骤
要实现子类创建多个实例,需要先让SpecialAccount成为Account的子类,再通过子类的new方法创建实例:
- 让SpecialAccount继承Account
先调用Account:new()生成一个继承自Account的新表,作为SpecialAccount的类表,而不是直接定义一个独立表。 - 给SpecialAccount添加自定义属性和方法
在继承后的SpecialAccount上添加专属的balance和special_receipt方法。 - 通过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
相关产品推荐
相关产品推荐

