2011-12-01 145 views
1

我想从另一个子类(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?

但它有点难以遵循,因为它涉及到我的问题。其中一个解决方案奏效,但被评论为不良形式,另一个解决方案无法正常工作,所以我想确保我的代码能够正确构建。

回答

2

通常,父类可以了解其子女,但不是相反。如果你不遵循这个原则,你最终会创建Circular dependencies,并且代码紧密耦合,难以维护。关键在于防止孩子直接调用父母的方法。

一个解决方案是使用event-based communication。当子类中发生某些事情时,它会触发父类可能选择处理或不处理的事件。

例如:

public function Circle() 
{ 
    var wedge:Wedge = new Wedge(); 
    wedge.addEventListener(MouseEvent.CLICK, onWedgeClick); 
} 
private function onWedgeClick(e:MouseEvent) { 
    deactiveCircle(); 
} 
+0

您可能希望从Wedge类派遣自定义事件并进行捕获。因此,在“handleWedgeClick”函数中,只需调用“this.dispatchEvent(new Event(”wedgeClick“));”然后听取“wedgeClick”而不是MouseEvent.CLICK。 – Glenn

+0

@panupan - 问题是我需要听取楔形对象内部的东西的点击,而不是楔形本身。 – mheavers

+1

你好,在这种情况下,你需要使用事件冒泡。这允许事件实际上通过视图层级“冒泡”。这是Responder Chain设计模式的一个实现,其中消息沿着链传递(在本例中为视图层次结构),为每个对象在传递消息之前处理它提供机会。看看这个简单的例子得到一个想法:http://blog.152.org/2009/11/flash-actionscript-3-event-bubbling.html – panupan

1

只需在Circle类中将wedgeClickHandler附加到楔形成员上 - 它将会收到MouseEvent就好了,它可以直接访问私有函数。

+0

如果我做到这一点 - 一个,我真的不喜欢与楔事情在圈内类,和两个 - 这不是我的挖起杆识别点击动作。实际的类会生成一个剪辑,并将该剪辑添加到该圆 - 所以我假设我需要在该类内部引用该剪辑。但我不知道如何做到这一点。 – mheavers

+0

@mheavers,你的'Circle'类正在实例化一个'Wedge',它负责管理'Wedge'实例;将Wedge绑定到一个Circle可以更好。如果你想变得更复杂,接口和工厂是可能的解决方案;但这可能会在你的案例中矫枉过正? – Peter

+0

其中之一 - 您对楔形内的事件做出反应,但是您正在停用* circle *。这样做是完全正确的,因为楔子不需要知道任何关于其父类的事情,楔子也是圈子的一员。两个 - 你的圈子应该有一个'私人变量楔子:楔子',否则它将被丢弃。另一方面,如果使用事件侦听器,楔形不需要引用圆。 – weltraumpirat

0

,因为它的可设置为private因为你Wedge对象需要有要在其调用方法Circle对象的引用,你不能叫Circle.deactivateCircle()

+0

你实际上并没有使用Singleton,这很好,因为它实际上是一种反模式http://misko.hevery.com/2008/11/21/clean-code-talks-global-state-and-singletons/ –