OOP 帮助 - 如何让此代码块识别其参数之一?

OOP Help - How do I get this code block to recognize one of its arguments?

我正在学习 Lua 以及如何实现 OOP。尝试一个对象的测试示例似乎 return 对象的参数之一为 'null' 尽管被分配了一个。

function Character(Name, Level, Class)   --Constructor
    return {GetName = T.GetName, GetLevel = T.GetLevel, GetClass = T.GetClass}
  end
end
-- Snippets
Player = Character("Bob", 1, "Novice")

当我尝试打印 Player.GetName() 时,它 returns null 而不是 Bob。我哪里做错了?

这里是the full code.

Lua 中的 OOP 比您在那里所做的要多一些,您将需要使用 metatables 和上值。

-- How you could define your character structure.
local Character = {}

function Character.GetName(self)
  return self.name
end

function Character.new(Name, Level, Class)
  local _meta = {}
  local _private = {}
  _private.name = Name
  _private.level = Level
  _private.class = Class

  _meta.__index = function(t, k) -- This allows access to _private
    return rawget(_private, k) or rawget(Character, k)
  end

  _meta.__newindex = function(t, k, v) -- This prevents the value from being shaded
    if rawget(_private, k) or rawget(Character, k) then
      error("this field is protected")
    else 
      rawset(t, k, v)
    end
  end
  return  setmetatable({}, _meta) --return an empty table with our meta methods implemented 
end

这会在您创建 Character 的新实例时创建本地 table _private。本地 table 是 _meta.__index 的上值,无法在 Character.new 函数范围之外访问。 _private可以在调用__index时访问,因为它是一个上值。

-- How to use the character structure 
player = Character.new("Bob", 10, "Novice")
npc = Character.new("Alice", 11, "Novice")
print(player:GetName())

我使用 player:GetName(),但老实说,您也可以使用 player.name

有关此主题的更多资源:

http://tutorialspoint.com/lua/lua_metatables.htm

http://lua-users.org/wiki/ObjectOrientationTutorial