2017-09-07 161 views
1

将子类作为参数传递给另一个函数是一种很好的做法,因为我希望修改子类的属性。Actionscript 3:将类作为参数传递

我特别想对类设置为

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

你可以添加一个超级简单的例子来你的问题,其中将包含你想使用的类结构 –

+0

我添加了一个例子。 – seventeen

+1

在你的例子中,你并不需要将'elem'传递给函数。你可以从'event.currentTarget'或'event.target'获取它。 –

回答

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忽略侦听器时,找出哪些对象fr记忆中的ee。虽然这会减少你的内存泄漏的可能性,但它仍然不是一个很干净的方式。尽管总是使用弱标志是一种很好的做法,或者在不再需要时总是明确地删除听众。

作为评价和对方的回答提到了,你其实并不需要使用您的代理类,下面将完成你想要什么:

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 
} 
+0

谢谢,这是一个很好的解释。 – seventeen

1

是的,这是很好的做法,根据您的应用程序体系结构。 在许多情况下,您可以将类作为方法参数发送。但是看看你的代码,你不是发送一个Class作为参数,而是一个DElem Class的实例,这也是一个很好的习惯。 某些事件带有它们的目标(即鼠标事件),您可以通过event.target或event.currentTarget访问它们。尽管为了抢占编译时错误,您可能会发现将方法参数类型化为正确的目标会更方便。