Можно ли использовать Lua и SWIG и, скажем, класс IInterface, чтобы реализовать этот интерфейс и создать экземпляр всего этого в Lua? Если да, то как это сделать?
Реализация и наследование классов C++ в Lua с использованием SWIG
Ответы (2)
Во-первых, интерфейсы в стиле C++ теперь имеют смысл в таком языке, как Lua. Чтобы объект Lua соответствовал интерфейсу, он просто должен содержать определения для всех функций в этом интерфейсе. Нет необходимости в каком-либо конкретном наследовании. Например, если у вас есть такой интерфейс C++:
// Represents a generic bank account
class Account {
virtual void deposit(double amount) = 0;
};
вы можете реализовать его на Lua без каких-либо конкретных спецификаций наследования:
SavingsAccount = { balance = 0 }
SavingsAccount.deposit = function(amount)
SavingsAccount.balance = SavingsAccount.balance + amount
end
-- Usage
a = SavingsAccount
a.balance = 100
a.deposit(1000)
Короче говоря, вам не нужен интерфейс C++. Если вам нужно расширить функциональность класса C++ из Lua, вы должны обернуть это в объект Lua, как описано здесь и выполните "метатабличное" наследование, как описано здесь . Также прочтите раздел об объектно-ориентированном программировании в руководстве по Lua.
Сохраните таблицу в классе C++, удерживая указатель на состояние lua и ссылку, возвращаемую для таблицы, как указано с помощью этого API:
http://www.lua.org/pil/27.3.2.html
Затем, когда вызывается метод класса-оболочки, поместите ссылочный объект в стек и выполните необходимый вызов функции.