Lua基于表的面向对象编程:两种版本

在互联网上,我找到了Lua中两种不同的解决方案来实现基于表的面向对象编程。我发现方法调用相似,但“构造函数”有所不同。

我想知道哪种解决方案具有更多的优势/更好。我知道Lua中还有一个基于闭包的面向对象编程,但在这里我只关心基于表的解决方案。

版本1(我喜欢这种语法)

Citizen = {name}

--构造函数
function Citizen:new(o, name)
  o = o or {}
  setmetatable(o, self)
  self.__index = self
  o.name = name
  return o
end

--获取器--
function Citizen:getName()
  return self.name
end
...

版本2

Citizen = {}
Citizen.__index = Citizen

setmetatable(Citizen, {
  __call = function(cls, ...)
  local self = setmetatable({}, cls)
  self:_init(...)
  return self
  end,
})

--构造函数
function Citizen:_init(name)
  self.name = name
end

--获取器--
function Citizen:getName()
  return self.name
end
...
点赞