Перейти к содержимому
  • 0
JTJag

Наследование в lua

Вопрос

У меня есть прототип объекта имеющего свои методы

У другого объекта должны присутствовать все те же методы что и у первого объекта.

Для создания объекта тараканы в голове сказали использовать метод метатаблицы __call

Поначалу думал что сделаю что то вроде:

--Здесь всё работает
Object1 = setmetatable({},{
__call = function(self)
   return setmetatable({t=1},self)
end
})
Object1.__index = Object1

function Object1:method()
   print("method "..self.t)
end

obj = Object1()
obj:method()
--Вот тут уже нет
Object2 = setmetatable(setmetatable({},Object1),{
__call = function(self)
   return setmetatable({t=2},self)
end
})
Object2.__index = Object2

function Object2:method2()
   self:method()
end

obj = Object2()
obj:method2()

и это будет работать. Но реальность меня огорчила...

OpenComputersErrorLog1.png

Изменено пользователем JTJag

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

На 16 строчке вы два раза меняете метатаблицу у одной и той же таблицы.

Object2 = setmetatable(setmetatable({},Object1),{
__call = function(self)
   return setmetatable({t=2},self)
end
})

Перепишите вот так:

Object2 = setmetatable({},Object1)

Метаметод __call в таком случае у вас не перепишется, да и зачем?
Если вам всё же необходимо это сделать, то вот решение:

Object2 = setmetatable({}, {
  __index = Object1;
  __call = function(self)
    return setmetatable({t=2},self)
  end;
})
Изменено пользователем Ktlo

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за быстрый ответ, наконец до меня дошло :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...