Actionscript 3:将类作为参数传递

Posted

技术标签:

【中文标题】Actionscript 3:将类作为参数传递【英文标题】:Actionscript 3: Passing classes as parameters 【发布时间】:2018-02-16 07:50:51 【问题描述】:

将子类作为参数传递给另一个函数是否是一种好习惯,因为我希望对子类的属性进行修改。

具体来说,我希望将类设置为

alpha = 0.5;

我通常会将子类设为主类的私有属性并以这种方式访问​​它。但是,我想知道这是更好还是更差的方法?

像这样:

        var d:DElem = new DElem(text);          
        addChild(d);
        d.addEventListener(MouseEvent.CLICK, Proxy.add(this, click, d));


        private function click(event:MouseEvent, elem:DElem):void 
            Animate.fadeOutIn(elem);
        

【问题讨论】:

您能否在您的问题中添加一个超级简单的示例,其中将包含您想要使用的类结构 我添加了一个例子。 在您的示例中,您实际上并不需要将 elem 传递给函数。您可以从event.currentTargetevent.target 获得它 看adobe提供的例子:Capturing mouse input 为了澄清您的术语,您传递的是类的实例,而不是类或子类。当您使用new 关键字时,您正在创建一个类的实例(在这种情况下,是DElem 的一个实例)。 DElemSprite 的子类(以及 Object 的所有其他类),这意味着该类继承了 Sprite 类的所有属性和方法。 【参考方案1】:

是的,根据您的应用程序架构,这是一种很好的做法。 在许多情况下,您可以将 Class 作为方法参数发送。但是看你的代码,你发送的不是一个Class作为参数,而是一个DElem Class的实例,这也是一个很好的做法。 一些事件带有它们的目标(即鼠标事件),您可以使用 event.target 或 event.currentTarget 访问。虽然,要获取编译时错误,您可能会发现将正确键入的目标也作为方法参数发送更方便。

【讨论】:

【参考方案2】:

看看你的代码,我肯定会反对它。除非您共享的代码只为整个应用程序运行一次,否则您很可能会发生内存泄漏。

当您向对象添加事件侦听器时,该事件侦听器会将对象保留在内存中,即使该对象已准备好进行垃圾回收(不再使用)。当您使用匿名函数添加事件侦听器时(大概是从Proxy.add 返回的内容,您就没有简单的方法来删除事件侦听器。执行d.removeEventListener(MouseEvent.CLICK, Proxy.add(this, click, d)) 将不起作用,因为 Proxy.add 返回一个新的/每次使用时都会使用不同的函数,因此即使在代码方面它与添加侦听器时相同,但由于返回的对象/函数不同,它实际上不会删除侦听器。

您可以在添加侦听器时将 true 传递给弱标志(第 5 个参数):

d.addEventListener(MouseEvent.CLICK, Proxy.add(this, click, d), false, 0, true);

这告诉 FlashPlayer 在确定要从内存中释放哪些对象时忽略侦听器。虽然这会减少您的内存泄漏可能性,但它仍然不是一个非常干净的方法。尽管最好始终使用弱标志,或者在不再需要时始终显式删除您的侦听器。

正如在 cmets 和其他答案中提到的那样,您实际上不需要使用您的 Proxy 类,以下将完成您想要的:

d.addEventListener(MouseEvent.CLICK, click, false, 0, true);

private function click(event:MouseEvent):void 
    Animate.fadeOutIn(event.currentTarget as Sprite);
    //event.currentTarget is a reference to the Object that you attached the listener to
    //event.target is the object that actually dispatched the event, which could be the same as event.currentTarget, or a child of it

【讨论】:

以上是关于Actionscript 3:将类作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

如何将类列表作为参数传递?

如何将类类型作为函数参数传递

将类对象实例作为参数从 main() 传递给另一个类对象实例

将类类型作为参数传递并针对 Kotlin 中的另一个对象检查类型

将类变量作为默认值分配给类方法参数

ActionScript 3 传递不同数量的参数。