Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如何向displayobject添加自定义方法_Oop_Lua_Coronasdk - Fatal编程技术网

Oop 如何向displayobject添加自定义方法

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

我想添加自定义方法来显示对象,类似于预构建的方法,例如“setFillColor”

我写了下面的代码,但它不起作用;然而,它解释了我需要什么

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的内部方法是最好的方法。