Глянул википедию, что-то сложна. Прототипная модель в Lua - это
когда у объекта не находится метода или поля, он ищет ее в
метатаблице. Эти метатаблицы можно соединять в иерархию
наследования. Но сами "методы" класса работают с фактическим
объектом, а не его метаипостасями, поэтому методы вызываются у
реализации, а не у этого класса.
--- Как бы класс-родитель
local A = {}
A.__index = A
function A:methodA()
self:methodB() -- при вызове из класса B будет вызван метод класса B, а не класса A
end
function A:methodB()
print('A:methodB')
end
--- Как бы класс-потомок
local B = setmetatable({}, A)
B.__index = B
function B:methodB()
print('B:methodB')
end
local a_inst = setmetatable({}, A)
local b_inst = setmetatable({}, B)
a_inst:methodA() -- 'A:methodB'
b_inst:methodA() -- 'B:methodB'
Та модель, которая у классов С++, стала бы вызывать A:methodA каждый раз, до тех пор, пока явно не приведешь this к дочернему типу.