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.currentTarget
或event.target
获得它
看adobe提供的例子:Capturing mouse input
为了澄清您的术语,您传递的是类的实例,而不是类或子类。当您使用new
关键字时,您正在创建一个类的实例(在这种情况下,是DElem
的一个实例)。 DElem
是 Sprite
的子类(以及 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() 传递给另一个类对象实例