我的目标是为用Lua编写的GUI编写一个插件。它应该替换窗口的创建,而无需更改GUI本身的代码。创建窗口的原始函数如下所示:
function GUIclass.createWindow(arg1, arg2, arg3, arg4, arg5)
-- do stuff
return window
end
我的方法如下:
function MyClass.createWindow(arg1, arg2, arg3, arg4, arg5)
local foo = self.attributeOne -- doesn't work, as self is undefined
-- do some more stuff wich requires foo
return window
end
... and later on
MyClassInst = MyClass:new()
请注意,这两个功能都在不同的文件中。我的想法是在初始化之后将指针替换为旧函数
GUIclass.createWindow = MyClass.createWindow
一切正常,但我似乎无法在MyClass.createWindow中获得对MyClass实例的引用。我尝试使用
local self = MyClassInst
在MyClass.createWindow中,但它是零。我也不喜欢这个,因为它仅限于Class的一个实例。正如标题中所述,":"也可以通过" GUIclass.createWindow(args)"来调用函数。 (现在指向MyClass.createWindow)。
那么如何在不使用"的情况下获得对类实例的引用:"?
答案 0 :(得分:1)
我只是发帖回答..
尝试:
function MyClass.createWindow(self, arg1, arg2, arg3, arg4, arg5)
据我记得lua,等于:
function MyClass:createWindow(arg1, arg2, arg3, arg4, arg5)
就像
一样class:something()
等于
class.something(class)
答案 1 :(得分:0)
你(大多数情况下):在这里为你所做的那一点。
如果您使用。调用该函数,除了您提供的参数(以及任何具有该功能的已关闭变量)之外,您不会拥有该调用的任何上下文。
如果您想创建自定义createWindow
函数的多个实例,可以让它们关闭某个类实例变量并在内部使用它,但您必须手动执行此操作并在之前使用这些类。我不知道你的情况是否可行。
我也不太了解代码所写的问题。
您是否希望有多个自定义createWindow
功能可以根据需要反复修补GUIclass
?或者,为什么您需要createWindow
以您编写的方式获取self
参数?
答案 2 :(得分:0)
如果您要创建新的窗口对象,则不需要自我参数。而是在MyClass.createWindow函数中创建新实例。通过使用表构造函数({})或通过调用另一个构造函数来执行此操作。例如:
local oldCreateWindow = GUIclass.createWindow
function MyClass.createWindow(...)
local window = oldCreateWindow(...)
local foo = window.attributeOne
-- do some more stuff wich requires foo
return window
end
我想我现在更了解你的问题了。我相信你会因为关闭而不是上课而感觉更好。
-- MyClass is actually just a table with lots of attributes that change a lot.
local MyClass = {}
local function createWindow(arg1, arg2, arg3, arg4, arg5)
local foo = MyClass.attributeOne
-- do some more stuff wich requires foo
return window
end
GUIclass.createWindow = createWindow
之后,您对MyClass所做的任何更改都应对GUIclass.createWindow可见。