Actionscript 3:将类作为参数传递

时间:2017-09-07 14:13:59

标签: oop actionscript-3 actionscript

将子类作为参数传递给另一个函数是不错的做法,因为我希望对子类的属性进行修改。

具体来说我希望将课程设置为

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);
        }

2 个答案:

答案 0 :(得分: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在确定哪些对象从内存中释放时忽略侦听器。虽然这会减少你的内存泄漏潜力,但它仍然不是一个非常干净的方式。虽然最好始终使用弱标志,或者在不再需要时始终显式删除监听器。

在评论和其他答案中提到,您实际上不需要使用您的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
}

答案 1 :(得分:1)

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