Lua面向对象编程中从原型继承表格的方法

在《Lua编程》中,我找到了一个例子来说明继承的应用。我理解了如何通过元表__index来处理它,但当我自己做一个继承的例子时,其中要继承的项目之一是一个表,我意识到这个表是由新创建的对象共享的:

Account = {
    balance = 0,
    info = {},
    withdraw = function (self, v)
        self.balance = self.balance - v
    end,
    deposit = function (self, v)
        self.balance = self.balance + v
    end,
    add = function (self, item)
        if self:check(item) then return end
        table.insert(self.info, item)
    end,
    remove = function (self, item)
        table.remove(self.info, item)
    end,
    check = function (self, item)
        for i, v in ipairs(self.info) do
            if v == item then return true end
        end
    end,
    new = function (self, o)
        o = o or {}
        self.__index = self
        setmetatable(o, self)
        return o
    end,
}

local a1 = Account:new()
local a2 = Account:new()
local a3 = Account:new()

a1:deposit(50)
a1:add("aaa")
a2:deposit(100)
a2:add("bbb")
a2:add("bbb")

print(a1.balance)
for _, v in ipairs(a1.info) do print(v) end
print(a2.balance)
for _, v in ipairs(a2.info) do print(v) end

这里的info被所有对象共享:

50
aaa
bbb
100
aaa
bbb

我怎么才能使info在每个新对象中都是唯一的呢?

编辑。解决方法是,我将所有“字段”放到方法new中,同时将方法保留在原型中,但我不认为这是很优雅的:

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

谢谢

点赞
用户4984564
用户4984564

答案可能比你想象的简单;你在"类"表中分配info。相反,仅在构造函数中为每个实例分配一个新的info表:

function Account:new(instance)
   instance = instance or {}
   instance.info = {}
   setmetatable(instance, self)
   return instance
end

请注意,在我的示例中,我已删除了self.__index = self这一行,因为你不应该在构造函数中这样做。相反,在创建表之后将其分配为Account.__index=Account

2020-04-02 12:05:28