Lua继承和instanceof

问题描述 投票:0回答:1

我正在尝试将一些Java代码移植到Lua,同时维护类继承,我想使用Lua实现的实例。

以下是我定义的模块:

-- 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

还有,

-- 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 实现如下:

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

如果我这样做:

local widget = ClientWidget.new() 

Object.isInstanceOf(widget, "AbstractClientObject")

它返回 false,我应该如何实现这样的功能?

inheritance lua instanceof
1个回答
0
投票

您应该更换:

setmetatable(ClientWidget, {__index = AbstractClientObject})

通过这个:

setmetatable(ClientWidget, AbstractClientObject)

因此,您的实例实现应该可以工作。由于 AbstractClientObject 已将 __index 设置为其自身,因此您不需要使用单独的表作为 ClientWidget 的元表(这就是导致循环不起作用的原因)。您可以直接使用 AbstractClientObject。那么元表链上的循环应该可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.