Я нашел этот учебник: http://lua-users.org/wiki/InheritanceTutorialНаследуйте метатаблицу (класс) и использовать его обязательный параметр конструктора
У меня метатаблица под названием Существо. Существо требует аргумента в своем конструкторе. Необходимый аргумент - это строка, которая представляет имя.
local creature = Creature(name)
- Существо имеет много других методов, таких как
getDescription()
. - Creature's
getDescription()
возвращает строку: "Это существо". - существа
getName()
возвращает строку: имя
Я хочу, чтобы создать новый метатаблицы (класс) называется Player
и он наследует Creature
метатаблицу (класс)
- Класс игрока перекроет только getDescription() способ.
- Класс Player также наследует метод getName() существа.
- Player getDescription() возвращает строку: "Это игрок".
Я хочу, чтобы иметь возможность сделать следующее:
local creature = Creature("Bob")
print(creature:getDescription())
print(creature:getName())
local player = Player("Joey")
print(player:getDescription())
print(player:getName())
Если печать:
Это существо
Боб
Это игроку
Joey
В основном, моя проблема в том, что для класса существа требуется аргумент, чтобы идентифицировать кого-то, имя. Его функция getName()
использует значение в аргументе и печатает его. Если я собираюсь использовать Player для наследования всех функций Существа (и, если необходимо, переопределить), как мне изменить код, чтобы убедиться, что Игрок получает необходимый ему аргумент?
код взят из учебника:
-- Create a new class that inherits from a base class
--
function inheritsFrom(baseClass)
-- The following lines are equivalent to the SimpleClass example:
-- Create the table and metatable representing the class.
local new_class = {}
local class_mt = { __index = new_class }
-- Note that this function uses class_mt as an upvalue, so every instance
-- of the class will share the same metatable.
--
function new_class:create()
local newinst = {}
setmetatable(newinst, class_mt)
return newinst
end
-- The following is the key to implementing inheritance:
-- The __index member of the new class's metatable references the
-- base class. This implies that all methods of the base class will
-- be exposed to the sub-class, and that the sub-class can override
-- any of these methods.
--
if baseClass then
setmetatable(new_class, { __index = baseClass })
end
return new_class
end