Arnault Bonafos
Arnault Bonafos

Reputation: 1

Lua inheritance and instanceof

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

Answers (1)

QuentinC
QuentinC

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

Related Questions