我正在尝试将一些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,我应该如何实现这样的功能?
您应该更换:
setmetatable(ClientWidget, {__index = AbstractClientObject})
通过这个:
setmetatable(ClientWidget, AbstractClientObject)
因此,您的实例实现应该可以工作。由于 AbstractClientObject 已将 __index 设置为其自身,因此您不需要使用单独的表作为 ClientWidget 的元表(这就是导致循环不起作用的原因)。您可以直接使用 AbstractClientObject。那么元表链上的循环应该可以工作。