Очевидным решением будет определение элемента: функция GetPos (), которая выполняет перенаправление.
function Item:GetPos()
return self:GetBaseObject():GetPos()
end
Где Item - метатабельный элемент.
Это так же эффективно, как и вносить изменения.на метатабельных и менее проблемных.
РЕДАКТИРОВАТЬ: Я могу помочь вам немного с повторяемостью тоже.
Вы можете реализовать следующие две функции:
function delegate(klass, methodName, memberName)
klass[methodName] = function(self, ...)
local member = self[memberName]
if type(member) == 'function' then member = self[memberName](self) end
return member[methodName](member, ...)
end
end
А затем используйте его следующим образом:
delegate(Item, 'GetPos', 'GetBaseObject')
Эта единственная строка будет делать то же самое, что и определение Item:GetPos
с 3 строками, приведенное выше.
Если вам нужно это много раз повторить, выможно оптимизировать его с помощью этой другой функции:
function delegateMany(klass, methodNames, memberName)
for _,methodName in ipairs(methodNames) do
delegateMethod(klass, methodName, memberName)
end
end
, которая должна позволять вам делать:
deletageMany(Item, {'GetPost', 'SetPos', 'GetColor', 'SetColor'}, 'GetBaseObject')
Я не тестировал ни одну из этих функций, поэтому остерегайтесь ошибок.Они должны работать как с «полученными свойствами» (self:GetSomething()
, так и с простыми доступами self.something
).Код предполагает, что вы всегда будете использовать «:» для вызова делегированных методов, поэтому self
добавляется при необходимости.