Oop 如何向displayobject添加自定义方法
我想添加自定义方法来显示对象,类似于预构建的方法,例如“setFillColor” 我写了下面的代码,但它不起作用;然而,它解释了我需要什么Oop 如何向displayobject添加自定义方法,oop,lua,coronasdk,Oop,Lua,Coronasdk,我想添加自定义方法来显示对象,类似于预构建的方法,例如“setFillColor” 我写了下面的代码,但它不起作用;然而,它解释了我需要什么 function display:foo(bar) print(bar) end local myRectangle = display.newRect( 0, 0, 150, 50 ) myRectangle:foo("something to be printed") 我希望“foo”方法可以用于所有显示对象,而不仅仅是myRectang
function display:foo(bar)
print(bar)
end
local myRectangle = display.newRect( 0, 0, 150, 50 )
myRectangle:foo("something to be printed")
我希望“foo”方法可以用于所有显示对象,而不仅仅是myRectangle?下面的示例。未经测试,但应该有效。然后它将可用于所有newRect调用。但是,您必须对所有display.*调用执行此操作
local oldNewRect = display.newRect
function display.newRect( ... )
local rect = oldNewRect( ... )
function rect:foo( str )
print( str )
end
return rect
end
-- usage
local rect = display.newRect( 0, 0, 40, 40 )
rect:foo( "hello" ) -- prints "hello"
有点复杂,因为我们需要劫持display.newRect调用。以下是如何做到这一点:
-- Store the old method
local oldNewRect = display.newRect
display.newRect = function(...)
local oDisplayObject = oldNewRect(...)
oDisplayObject.foo = function(oDisplayObject, sText)
-- Do something with the display object
-- Print the text passed as argument
print(sText)
end
return oDisplayObject
end
local myRectangle1 = display.newRect( 0, 0, 150, 50 )
myRectangle1:foo("something to be printed")
local myRectangle2 = display.newRect( 0, 0, 150, 50 )
myRectangle2:foo("something to be printed")
我不希望替换库中的任何方法,因为这意味着创建的每个对象(不仅仅是您创建的对象)都会受到影响,这可能会产生意外的副作用。因此,我主张简单地创建一个函数,将所需的方法添加到您创建的每个实例中。此方法还用作签名,表明此显示对象是“您的”(不是由Corona“幕后”创建的)。比如说,
function myNewCustomRect(...)
local obj = display.newRect(...)
obj.foo = function (self, a,b,c)
-- self is obj, although obj is an upvalue so can use directly too
print(self, obj, a,c,b)
end
return obj
end
yourRect = myNewCustomRect(0, 0, 150, 50)
yourRect:foo(1,2,3) -- first two data printed should be same
它不起作用,因为返回了一个
ShapeObject
。你是想添加一个方法还是用你自己的方法替换一个现有的方法?@scholli我想要一个像“Foo”这样的新方法:)不起作用,因为他想作为参数传递stringYeah。我正在演示如何向每个显示对象构造函数添加函数。添加将参数作为字符串传递给我上面发布的内容的功能,可以添加传入字符串并打印其内容的功能value@PersuitOfPerfection另一方面,…
确保传递函数调用的所有参数。冒号语法也可以。没有要求arg name必须是self
。我想这是个人喜好的问题。更整洁地传递自我imho@scholli,我不是这么说的。我理解代码的工作原理。@PersuitOfPerfection Well self只是Lua中的一个构造。在我的例子中,我更喜欢明确地使用.foo=function()表示法来清楚地解释发生了什么,因为:foo表示法有时可能会令人困惑,特别是当你劫持方法调用时,比如在本例中。是的,这比覆盖corona的显示方法要好,但是他要求对显示对象本身进行扩展,这就是我在示例中展示的。然而,我同意创建自己的方法调用corona的内部方法是最好的方法。