Reputation: 1
I'm trying to port some Java code to Lua, while maintaining class inheritance I want to use an instanceof Lua implementation.
Here are the modules I define:
-- ClientWidget class
local ClientWidget = {}
ClientWidget.__index = ClientWidget
ClientWidget.ClassName = "ClientWidget"
local AbstractClientObject = require("df.AbstractClientObject")
setmetatable(ClientWidget, {__index = AbstractClientObject})
function ClientWidget.new()
local self = {}
setmetatable(self, ClientWidget)
AbstractClientObject.init(self)
ClientWidget.init(self)
return self
end
And,
-- AbstractClientObject class
local AbstractClientObject = {}
AbstractClientObject.__index = AbstractClientObject
AbstractClientObject.ClassName = "AbstractClientObject"
function AbstractClientObject.new()
local self = {}
setmetatable(self, AbstractClientObject)
AbstractClientObject.init(self)
return self
end
InstanceOf is implemented as following:
function Object.isInstanceOf(object, className)
if not object then return false end
-- Récupère la métatable de l'objet
local mt = getmetatable(object)
while mt do
if mt.ClassName == className then
return true
end
-- Remonte la chaîne d'héritage
mt = getmetatable(mt)
end
return false
end
If I do:
local widget = ClientWidget.new()
Object.isInstanceOf(widget, "AbstractClientObject")
it returns false, how am I supposed to implement such a feature ?
Upvotes: 0
Views: 53
Reputation: 14837
You should replace:
setmetatable(ClientWidget, {__index = AbstractClientObject})
By this:
setmetatable(ClientWidget, AbstractClientObject)
And so, your instanceof implementation should work. Since AbstractClientObject has set __index to be itself, you don't need to use a separate table as a metatable for ClientWidget (this is what cause the loop to not work). You can use AbstractClientObject directly. The loop going up metatable chain should work then.
Upvotes: 2