ООП в Lua занимает немного больше, чем то, что вы там делали, вы захотите использовать метатаблицы и значения.
-- 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
Это создает локальную таблицу _private
при создании нового экземпляра Character
.Эта локальная таблица является повышением до _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