Class
Каркас для ООП.
Lua язык прототипного программирования и не имеет явной системы для работы с классами, но имеет таблицы, которые можно за них выдать с помощью замыканий и метатаблиц.
Animal = l.class({
name = '';
say = '';
info = function(self)
print(('%s говорит "%s".'):format(self.name, self.say));
end;
});
Cat = l.class(Animal, {
name = 'Кошка';
say = 'мяу, бэйба';
});
function Cat: __init()
print('Про кошку:');
end;
dog = Animal();
dog.name = 'Собака';
dog.say = 'гав';
-- Собака говорит "гав".
dog:info();
-- Про кошку:
cat = Cat();
-- Кошка говорит "мяу, бэйба".
cat:info();
Сами объекты выглядят следующим образом.
l.dump(dog);
--[[ (table)table: 005FCC98 {
[info] => (function)function: 00439ED8
[name] => (string)Собака
[say] => (string)гав
} ]]
l.dump(getmetatable(dog));
--[[ (table)table: 004381B8 {
[__class] => (string)Animal
} ]]
l.dump(cat);
--[[ (table)table: 004412C0 {
[info] => (function)function: 00439ED8
[name] => (string)Кошка
[say] => (string)мяу, бэйба
} ]]
l.dump(getmetatable(cat));
--[[ (table)table: 00438528 {
[__class] => (string)Cat
} ]]
У самих классов метаталицы вернут __name (название) и "магические" методы: метаданные, __init, __parents (все родители), __parent (основной родитель, то есть последний в иерархии наследования) и т.д.
-- Animal
print(Cat.__parent.__name);
Родителей можно полуать по цепочке.
-- nil - в данном случае, т.к. Animal ничего не наследуцет
print(Cat.__parent.__parent.__parent.__name);