在另一个子类中的一个子类中闪存as3调用函数
我想从另一个子类(Wedge.as)调用一个子类(Circle.as)中的函数。 Circle.as由文档类(Tree.as)实例化,Wedge.as由Circle.as实例化。我该怎么做呢?这是我的代码:在另一个子类中的一个子类中闪存as3调用函数
Tree.as
package com.treediagram
{
public class Tree extends MovieClip
{
var firstCircle:Circle = new Circle();
addChild(firstCircle);
}
}
Circle.as:
package com.treediagram
{
public class Circle extends MovieClip
{
private var wedge:Wedge;
public function Circle()
{
var circleHolder:MovieClip = new MovieClip();
var circleClip:MovieClip = new MovieClip();
circleClip.addEventListener(MouseEvent.CLICK,circleClickedEvent);
}
private function circleClickedEvent(e:MouseEvent):void
{
var wedgeHolder:MovieClip = new MovieClip();
circleHolderRef.addChildAt(wedgeHolder,1);
var wedge:Wedge = new Wedge(wedgeHolderRef);
wedge.addEventListener(MouseEvent.CLICK,wedgeClickEvent);
}
private function wedgeClickEvent(e.target){
trace ('click'); //NOT WORKING
}
}
}
Wedge.as
package com.treediagram
{
public class Wedge extends MovieClip
{
public function Wedge(wedgeHolderRef)
{
var wedgeClip:MovieClip = new MovieClip();
wedgeClip.addEventListener(Event.ADDED_TO_STAGE, wedgeAddedEvent);
wedgeHolderRef.addChild(wedgeClip);
}
}
}
我看到了类似的问题,这在这里:
How to call a function in a Class from another Class?
但它有点难以遵循,因为它涉及到我的问题。其中一个解决方案奏效,但被评论为不良形式,另一个解决方案无法正常工作,所以我想确保我的代码能够正确构建。
通常,父类可以了解其子女,但不是相反。如果你不遵循这个原则,你最终会创建Circular dependencies,并且代码紧密耦合,难以维护。关键在于防止孩子直接调用父母的方法。
一个解决方案是使用event-based communication。当子类中发生某些事情时,它会触发父类可能选择处理或不处理的事件。
例如:
public function Circle()
{
var wedge:Wedge = new Wedge();
wedge.addEventListener(MouseEvent.CLICK, onWedgeClick);
}
private function onWedgeClick(e:MouseEvent) {
deactiveCircle();
}
只需在Circle类中将wedgeClickHandler附加到楔形成员上 - 它将会收到MouseEvent就好了,它可以直接访问私有函数。
如果我做到这一点 - 一个,我真的不喜欢与楔事情在圈内类,和两个 - 这不是我的挖起杆识别点击动作。实际的类会生成一个剪辑,并将该剪辑添加到该圆 - 所以我假设我需要在该类内部引用该剪辑。但我不知道如何做到这一点。 – mheavers
@mheavers,你的'Circle'类正在实例化一个'Wedge',它负责管理'Wedge'实例;将Wedge绑定到一个Circle可以更好。如果你想变得更复杂,接口和工厂是可能的解决方案;但这可能会在你的案例中矫枉过正? – Peter
其中之一 - 您对楔形内的事件做出反应,但是您正在停用* circle *。这样做是完全正确的,因为楔子不需要知道任何关于其父类的事情,楔子也是圈子的一员。两个 - 你的圈子应该有一个'私人变量楔子:楔子',否则它将被丢弃。另一方面,如果使用事件侦听器,楔形不需要引用圆。 – weltraumpirat
,因为它的可设置为private
因为你Wedge
对象需要有要在其调用方法Circle
对象的引用,你不能叫Circle.deactivateCircle()
。
你实际上并没有使用Singleton,这很好,因为它实际上是一种反模式http://misko.hevery.com/2008/11/21/clean-code-talks-global-state-and-singletons/ –
您可能希望从Wedge类派遣自定义事件并进行捕获。因此,在“handleWedgeClick”函数中,只需调用“this.dispatchEvent(new Event(”wedgeClick“));”然后听取“wedgeClick”而不是MouseEvent.CLICK。 – Glenn
@panupan - 问题是我需要听取楔形对象内部的东西的点击,而不是楔形本身。 – mheavers
你好,在这种情况下,你需要使用事件冒泡。这允许事件实际上通过视图层级“冒泡”。这是Responder Chain设计模式的一个实现,其中消息沿着链传递(在本例中为视图层次结构),为每个对象在传递消息之前处理它提供机会。看看这个简单的例子得到一个想法:http://blog.152.org/2009/11/flash-actionscript-3-event-bubbling.html – panupan