面向对象编程帮助 - 如何让代码块识别其参数?

我正在学习Lua和如何实现面向对象编程。尝试测试对象的一个示例似乎返回对象的一个参数为“null”,尽管已经分配了一个。

function CharacterNameLevelClass--构造函数
    return {GetName = T.GetNameGetLevel = T.GetLevelGetClass = T.GetClass}
  end
end
--片段
Player = Character(“Bob”,1,“Novice”)

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

这是完整代码

点赞
用户7396148
用户7396148

Lua 中的面向对象编程需要比你在这里做的更多,你需要利用元表和上值。

-- 这是如何定义角色结构的代码
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) -- 这允许访问私有变量
    return rawget(_private, k) or rawget(Character, k)
  end

  _meta.__newindex = function(t, k, v) -- 这会防止值被重写
    if rawget(_private, k) or rawget(Character, k) then
      error("this field is protected")
    else
      rawset(t, k, v)
    end
  end
  return  setmetatable({}, _meta) -- 返回一个带有 meta 方法实现的空表
end

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

-- 如何使用角色结构
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

2019-06-05 23:06:02